BOJ 11057 - 오르막 수 문제풀이
문제를 읽고 이해하기
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.
예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.
수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.
입력
첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.
출력
첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.
재정의와 추상화
점화식만 세우면 Top-down으로 풀던, Bottom-up으로 풀던 상관 없다.
// Top-down
dp[n][prev] = sum(dp[n - 1][i]) (prev <= i <= 9)
// Bottom-up
dp[n][num] = dp[n - 1][num] + dp[n][num - 1]
코드 작성
#include <iostream>
using namespace std;
long long cache[1001][10];
long long dp(int n, int prev) {
if (n == 0) { return 1; }
auto & ref = cache[n][prev];
if (ref)
return ref;
for (int i = prev; i <= 9; i++)
ref += dp(n - 1, i) % 10007;
return ref;
}
int main() {
int n;
cin >> n;
cout << dp(n, 0) % 10007;
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
BOJ 11048 - 이동하기 문제풀이 (0) | 2020.04.01 |
---|---|
BOJ 11052 - 카드 구매하기 문제풀이 (0) | 2020.04.01 |
BOJ 17839 - Baba is Rabbit 문제풀이 (0) | 2020.03.31 |
BOJ 1929 - 소수 구하기 문제풀이 (0) | 2020.03.30 |
BOJ 6603 - 로또 문제풀이 (0) | 2020.03.30 |
댓글
이 글 공유하기
다른 글
-
BOJ 11048 - 이동하기 문제풀이
BOJ 11048 - 이동하기 문제풀이
2020.04.01 -
BOJ 11052 - 카드 구매하기 문제풀이
BOJ 11052 - 카드 구매하기 문제풀이
2020.04.01 -
BOJ 17839 - Baba is Rabbit 문제풀이
BOJ 17839 - Baba is Rabbit 문제풀이
2020.03.31 -
BOJ 1929 - 소수 구하기 문제풀이
BOJ 1929 - 소수 구하기 문제풀이
2020.03.30