다이나믹 프로그래밍을 이용해서 푸는 문제 자리 수가 i이고 자리 수의 마지막 수가 j라고 하면 d[i][j] 라는 식으로 표현하고
이는 d[i][j] += d[i -1][k] (0 <= k<= j) 점화식으로 확장 될 수 있다. 잘 생각해보면 예를들어 마지막 수가 8이면 마지막 수가 0부터 8까지 전 자리 수의 개수를 더해주면 된다. 3중 for문이라 좀 당황했는데 n에 따라 변하지는 않으므로 복잡도는 O(n)이라고 볼 수 있을 것 같다.
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 | #include <iostream> using namespace std; int input = 0; long long d[1050][15]; int main() { cin >> input; for(int i = 0;i < 10; ++i) d[1][i] = 1; for(int i = 2; i <= input; ++i) { for(int j = 0;j <= 9; ++j) { for(int k = 0;k <= j; ++k) { d[i][j] += d[i - 1][k]; d[i][j] %= 10007; } } } long long ans = 0; for(int i = 0;i < 10; ++i) { ans += d[input][i]; ans %= 10007; } cout << ans; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 11053: 가장 긴 증가하는 부분 순열 (0) | 2018.07.09 |
---|---|
백준 2156: 포도주 시식 (0) | 2018.07.09 |
백준 9465: 스티커 (0) | 2018.07.09 |
백준 2193: 이친수 (0) | 2018.07.09 |
백준 10799: 쇠막대기 (0) | 2018.07.09 |