https://www.acmicpc.net/problem/11057
전형적인 DP 문제이다.
2차원 배열을 통해 점화식을 세우면 다음과 같다.
dp[i][j] = i 번째에서 j 값의 오르막 수
위의 점화식에서 i가 1일 때 (수의 길이가 1일 때)
모든 값을 1로 지정한다.
그리고 N 번째까지 모든 값을 구하면 되는데
dp[i][j]=dp[i-1][0]+....+dp[i-1][j-1]을 통해 값을 더해준 후 10007로 나눠주면 된다.
시간 복잡도는 O(N*10^2)으로 제한 시간 내에 문제를 해결할 수 있다.
마지막에 i가 N 일 때 0부터 9까지 dp[N][j] 값을 더해주면 되는 데
모두 더한 뒤에도 10007로 나눠주는 것을 잊지 말자
(마지막에 안 나눠줘서 fail됐다.....)
모든 값을 1로 지정한다.
그리고 N 번째까지 모든 값을 구하면 되는데
dp[i][j]=dp[i-1][0]+....+dp[i-1][j-1]을 통해 값을 더해준 후 10007로 나눠주면 된다.
시간 복잡도는 O(N*10^2)으로 제한 시간 내에 문제를 해결할 수 있다.
마지막에 i가 N 일 때 0부터 9까지 dp[N][j] 값을 더해주면 되는 데
모두 더한 뒤에도 10007로 나눠주는 것을 잊지 말자
(마지막에 안 나눠줘서 fail됐다.....)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <iostream> #include <vector> using namespace std; int main() { int N; cin >> N; vector<vector<int>> dp(N+1,vector<int>(10,0)); for (int j = 0; j < 10; j++) dp[1][j] = 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; } } int ans = 0; for (int j = 0; j < 10; j++) ans += dp[N][j]; ans %= 10007; cout << ans << endl; return 0; } | cs |
'알고리즘(BOJ) > DP' 카테고리의 다른 글
백준 2133번 - 타일 채우기 (4) | 2018.01.29 |
---|---|
백준 11048번 - 이동하기 (0) | 2018.01.28 |
백준 2294번 - 동전 2 (0) | 2018.01.28 |
백준 9461번 - 파도반 수열 (0) | 2018.01.28 |
백준 9465번 - 스티커 (0) | 2018.01.28 |