https://www.acmicpc.net/problem/11057
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수
www.acmicpc.net
코드 :
1. dp - top down
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static final int MOD = 10_007;
static long[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
//dp[N][num] = 길이가 N인 오르막수의 마지막 수가 num일때 경우의 수
dp = new long[N+1][10];
for (int i = 0; i < 10; i++) {
dp[1][i] = 1;
}
int result = 0;
for (int i = 0; i < 10; i++) {
result += recur(N, i);
result %= MOD;
}
System.out.println(result);
}
public static long recur(int N, int num){
if(dp[N][num] == 0){
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
dp[N][i] += recur(N - 1, j);
dp[N][i] %= MOD;
}
}
}
return dp[N][num] % MOD;
}
}
2. dp - bottom up
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static final int MOD = 10_007;
static long[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new long[N+1][10];
for (int i = 0; i < 10; i++) {
dp[1][i] = 1;
}
for (int i = 2; i < N+1; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k <= j; k++) {
dp[i][j] = (dp[i][j] + dp[i - 1][k] % MOD);
}
}
}
int answer = 0;
for (int i = 0; i < 10; i++) {
answer += dp[N][i];
answer %= MOD;
}
System.out.println(answer);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1932번 - 정수 삼각형 (Java) (0) | 2022.04.03 |
---|---|
백준 9456번 - 스티커(Java) (0) | 2022.03.31 |
백준 1309번 - 동물원 (Java) (0) | 2022.03.29 |
백준 1149번 - RGB거리 (Java) (0) | 2022.03.29 |
백준 15988번 - 1, 2, 3 더하기 3 (Java) (0) | 2022.03.29 |
댓글