URL : https://www.acmicpc.net/problem/11726
소스코드 :
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] dp = new int[n+1]; dp[0] = 1; dp[1] = 1; for(int i=3; i<=n; i++){ dp[i] = dp[i-1] + dp[i-2]; dp[i] %= 10007; } System.out.println(dp[n]); }
- Category : 다이나믹 프로그래밍
- My Thiking
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] dp = new int[n+1]; dp[1] = 1; dp[2] = 2; for(int i=3; i<=n; i++){ dp[i] += dp[i-1] + 1; dp[i] += dp[i-2] + 1; dp[i] %= 10007; } System.out.println(dp[n]); }
처음에는 다음과 같은 방식으로 접근을 하려해서 오류가 났다. + 1을 하는 것은 타일 2 x 1 이나 1 x 2 중 하나를 선택하는 것인데 이 문제 같은 경우는 끝에 2 x 1 블럭 또는 1 x 2 가 올 경우로 각각 나누어서 dp[i-1]과 dp[i-2]의 합으로 푸는 것이 보다 정확하다. 2번째 문제로는 항상 dp[0]을 무엇으로 두느냐에 대한 문제였다. 그래서 최백준님께 강의를 들으면서 질문을 드렸고 대답은 다음과 같았다.
`d[0] = 1`을 주는 경우는 경우의 수 문제의 경우에 주로 사용합니다.
|
나의 경우에는 d[0]을 초기화 하지 않았기 때문에 dp[1], dp[2]를 초기화해서 사용해서 접근할 수 있었다.
'전공지식 > 알고리즘' 카테고리의 다른 글
[백준][DP][2193] 이친수 (0) | 2016.12.15 |
---|---|
[백준][DP][11057] 오르막 수 (0) | 2016.12.15 |
[백준][DP][10844] 쉬운 계단 수 (0) | 2016.12.15 |
[알고스팟][완전탐색] 보글 게임 (0) | 2016.12.14 |
[JM북][완전탐색] n개의 원소 중 m개를 고르는 모든 조합을 찾는 알고리즘 (0) | 2016.12.14 |