BOJ 11057: 오르막 수 https://www.acmicpc.net/problem/11057
DP
를 사용한다.
메모이제이션
할 배열은 2차원 배열로 생성한다.
배열의 행
은 오르막 수의 길이
, 열
은 오르막 수의 마지막 수의 값
이다.
길이가 3
인 오르막 수의 총 개수를 구하는 경우
0 1 2 3 4 5 6 7 8 9 total 오르막 수 N=1 1 1 1 1 1 1 1 1 1 1 10 N=2 1 2 3 4 5 6 7 8 9 10 55 N=3 1 3 6 10 15 21 28 36 45 55 220
길이가 1
일 땐 모두 자기 자신이 오르막 수
이기 때문에 1
이 기록된다.
길이가 i
인 오르막 수의 끝 자리가 j일 때
의 수는 길이가 i - 1
인 0 ~ j 까지의 오르막 수의 합
과 같다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 구해야 하는 수의 길이 입력
int N = Integer.parseInt(br.readLine());
// 길이가 1 -> 모두 자기 자신이라서 오르막 수는 1개씩 있음
long[][] dp = new long[N + 1][10];
for (int i = 0; i < 10; i++) {
dp[1][i] = 1;
}
// 길이가 i일 때 오르막 수 구하기
for (int i = 2; i <= N; i++) {
// 끝 자리가 j일 때 오르막 수 구하기
for (int j = 0; j < 10; j++) {
// 이전 길이(i-1)일 때 끝 자리가 j보다 작은 모든 수들을 더함
for (int k = 0; k <= j; k++) {
dp[i][j] += dp[i-1][k];
}
dp[i][j] %= 10007;
}
}
long answer = 0;
for(int i=0; i<10; i++) {
answer += dp[N][i];
}
System.out.println(answer % 10007);
}
}