적절한 점화식을 찾는것이 중요합니다. 1,2,3만을 통해서 합을 나타내는 수를 출력해야하므로 4에 대한 합을 찾는다 가정하였을때
4일 경우 경우의 수는
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
즉, 7 = 4 + 2 + 1 -> f(4) = f(3) + f(2) + f(1)다음과 같이 바꿀 수 있습니다.
5일 경우까지 해본다면,
- 1+1+1+1+1
- 2+1+1+1
- 1+2+1+1
- 1+1+2+1
- 1+1+1+2
- 2+2+1
- 2+1+2
- 1+2+2
- 3+1+1
- 1+3+1
- 1+1+3
- 3+2
- 2+3
총 13가지가 나오고
13 = 7 + 4 +2 -> f(5) = f(4) + f(3) + f(2)라는 결과가 나옵니다.
점화식으로는 f(n) = f(n-1) + f(n-2) + f(n-1)으로 나타 낼 수 있습니다. 이를 재귀방식으로 코드를 짠다면,
package com.company;
import java.util.Scanner;
public class Main {
static int result[] = new int[1001];
public static int cal(int n){
result[0] = 1;
result[1] = 1;
result[2] = 2;
result[3] = 4;
if(result[n] != 0 ){
return result[n];
}
else {
result[n] = (cal(n - 1) + cal(n - 2) + cal(n-3)) % 10007;
}
return result[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 0; i<n; i++){
int num = sc.nextInt();
System.out.println(cal(num));
}
}
}
다음과 같은 코드를 만들 수 있습니다.
'C++ > DP' 카테고리의 다른 글
DP - 2193 (이친수) (0) | 2021.01.07 |
---|---|
DP - 11057(오르막 수) (0) | 2021.01.06 |
DP - 10844(쉬운 계단 수) (0) | 2021.01.06 |
DP - 11726 (2xn 타일링) (0) | 2021.01.06 |
DP - 1463(1로 만들기) (0) | 2021.01.06 |