https://www.acmicpc.net/problem/11057
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class Main {
public int getAscendingNum(int num) {
if(num == 1)
return 10;
else if(num == 2)
return 55;
int[][] dp = new int[num + 1][10];
Arrays.fill(dp[1], 1);
for(int i = 0; i < 10; i++) {
dp[2][i] = i + 1;
}
for(int i = 3; i <= num; i++) {
for(int j = 0; j < 10; j++) {
for(int l = 0; l <= j; l++) {
dp[i][j] += (dp[i - 1][l] % 10007);
}
}
}
long ascending_num = 0;
for(int i = 0; i < dp[num].length; i++) {
ascending_num += dp[num][i];
}
return (int)(ascending_num % 10007);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
br.close();
Main m = new Main();
bw.write(m.getAscendingNum(num) + "\n");
bw.flush();
bw.close();
}
}
해당 문제는 DP를 이용하여 해결할 수 있습니다.
길이가 1인 수부터 N인 수까지 각 길이에서의 오르막 수의 개수를 구하는데, 각 길이에서 가장 뒷자리 수가 0인 수부터 9인 수까지의 오르막 수의 개수를 각각 구합니다.
길이가 1일 때는 뒷자리 수가 0인 수부터 9인 수까지 모두 오르막 수의 개수가 1이기 때문에 1로 초기화를 시킵니다.
길이가 2인 수에서 뒷자리 수가 0인 수부터 9인 수까지의 길이는 아래와 같습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
길이가 3인 수에서 뒷자리 수가 0인 수부터 9인 수까지의 길이는 아래와 같습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1 | 1 + 2 | 1 + 2 + 3 | 1 + 2 + 3+ 4 | 1 + 2 + 3+ 4 + 5 | 1 + 2 + 3 + 4 + 5 + 6 | 1 + 2 + 3 + 4 + 5 + 6 + 7 | 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 | 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 | 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 |
위 개수들을 확인해보면 길이가 3인 수에서 뒷자리 수가 N인 수의 오르막 수의 개수는 길이가 2인 수에서 뒷자리 수가 0인 수부터 N인 수까지의 오르막 수의 개수의 합과 같다는 것을 알 수 있습니다.
예를 들어, 길이가 3인 수에서 뒷자리 수가 3인 수를 보면
이러한 수들이 있는데, 뒷자리 수 3을 제외하고 앞의 두 자리 숫자만 생각해본다면, 위에서부터 길이가 2인 수에서 뒷자리가 0인 수, 1인 수, 2인 수, 3인 수와 같습니다.
그렇기 때문에 길이가 N인 수 중 뒷자리가 i인 수의 오르막 수의 개수를 dp[N][i]라고 한다면
이러한 점화식을 세울 수 있습니다.
위 점화식을 바탕으로 오르막 수의 개수를 구합니다.