algorithm
[DP] 11057
tonirr
2020. 4. 20. 06:06
- 계단 수나 이번 문제나 표에 정리하여 접근해야 겠다. 메모장에 기록하니 이중배열의 문제의 경우 전 행의 숫자들을 활용하가 어려운 것 같다.
- Memo
- 문제 정의
- 이중배열을 사용하여 접근한다.
- 계단 수는 맨앞의 숫자를 기준으로 규칙을 세우는 것이고 이번 문제는 맨 뒤의 숫자를 기준으로 규칙을 세운다.
- 최종으로 구해야 할 값은 n행의 모든 값을 더한 값이다.
- n-1, n-2, ... 행의 오르막 수는 이미 n행에 포함되어있다.
- 방법
- 먼저 1행의 모든 값을 1로 초기화 시킨다.
- n행의 각각의 열을 구할 때에는
- 행을 구하는 i를 n까지 돌리는 for문
- 열의 마지막 값까지 구하는 j를 9까지 돌리는 for문
- i행 j열에 해당하는 값을 구하는 k가 j까지 돌아가는 for문을 정의
- 이러한 for문 안에서 dp[i][j] 의 값을 각각 구하고 n행의 모든 값을 더해주면 된다.
- 문제 정의
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
long dp[][] = new long[n+1][10];
int result = 0;
for(int i = 0; i < 10; i++) {
dp[1][i] = 1;
}
for(int i = 2; i <= n; i++) {
for(int j = 0; j < 10; j++) {
for(int k = 0; k <= j; k++) {
dp[i][j] += dp[i-1][k];
}
dp[i][j] %= 10007;
}
}
for(int i = 0; i < 10; i++) {
result += dp[n][i];
}
System.out.println(result % 10007);
}
}