dp문제다.
0, 9 는 퍼져나갈 수 있는 1과 8밖에 못받고
나머지는 자신의 수 -1, +1인 수의 개수를 받을 수 있다는 것을 이용했다.
처음에 0이 오면 안되기 때문에 마지막에서부터 연산을 진행해 최종적으로
1~9로 시작할 수 있는 계단 수를 더해서 답을 구한다.
(아래의 식을 이용하면 sum이 아닌 dp만을 나누어 준다는 것에 주의!
sum += dp[len-1][k] % 1000000000;)
#include <iostream>
int main(void) {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int len;
std::cin >> len;
long long dp[101][10] = { 0 };
for(int i = 0; i < 10; i++) {
dp[0][i] = 1;
}
for(int i = 1; i < len; i++) {
for (int j = 0; j < 10; ++j) {
if (j == 0 && i < len - 1) {
dp[i][j] = dp[i - 1][j + 1];
} else if (j == 9) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1] % 1000000000;
}
}
}
long long sum = 0;
for (int k = 1; k < 10; ++k) {
sum = (sum + dp[len - 1][k]) % 1000000000;
}
std::cout << sum << "\n";
return 0;
}
|
cs |
'problem solving' 카테고리의 다른 글
2011번: 암호코드 (0) | 2020.03.05 |
---|---|
[하노이 탑]재귀 (0) | 2020.03.05 |
10815번: 숫자 카드 (0) | 2020.03.04 |
10610번: 30 (0) | 2020.03.04 |
9613번: GCD 합 (0) | 2020.03.04 |