문제
접근 방법
바로 앞의 수가 0과 9일때 주의해서 점화식을 세운다. 처음 제출할 때 출력할때만 나머지를 계산해서 출력되도록해서 오버플로우 발생으로 오답이 됐다.
점화식은 자릿수와 바로 앞의 숫자를 인덱스로 모든 경우를 저장한다.
if(앞에 저장된 숫자가 0) dp[i][j] = dp[i - 1][1];
if(앞에 저장된 숫자가 9) dp[i][j] = dp[i - 1][8];
나머지 모든 경우는 dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
코드
#include <iostream> #define mod 1000000000 using namespace std; int N; long long dp[101][10]; int main() { cin >> N; dp[1][0] = 0; for(int i = 1; i <= 9; i ++) { dp[1][i] = 1; } for(int i = 2; i <= N; i ++) { for(int j = 0; j <= 9; j ++) { dp[i][j] = 0; if(j == 0) { dp[i][j] = dp[i - 1][1]; } else if(j == 9) { dp[i][j] = dp[i - 1][8]; } else { dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; } // 숫자가 너무 커서 오버플로우, 미리 나눈값 저장. dp[i][j] %= mod; } } long long ans = 0; for(int i = 0; i <= 9; i ++) ans += dp[N][i]; cout << ans % mod << endl; return 0; }