https://www.acmicpc.net/problem/10844
인접한 모든 자리의 차이가 1인 N자리 수가 몇 개인지 구하는 문제다.
ex) 45654, 101
top-down 방식의 dp로 풀었다.
1.맨 처음 올 수 있는 수는 1~9 이므로 for문으로 함수 go(1,i)를 호출한다.
lv은 트리의 깊이
, k는 다음 자리에 입력된 수
다.2.함수 내에 k와 lv의 범위를 설정해준다.
3.dp[lv][k] += go(lv + 1, k - 1) + go(lv + 1, k + 1)
아무리 생각해도 bottom-up방식보다 top-down이 쉬운건 뭘까..
#include <iostream>
#include <algorithm>
using namespace std;
long long n, dp[101][10], ret;
static long mod = 1000000000;
long long go(int lv, int k)
{
if (k > 9 || k < 0)
return 0;
if (lv == n)
return 1;
if (dp[lv][k])
return dp[lv][k];
dp[lv][k] += go(lv + 1, k - 1) + go(lv + 1, k + 1);
return dp[lv][k] % mod;
}
int main()
{
cin >> n;
for (int i = 1; i <= 9; i++)
ret += go(1, i);
cout << ret % mod << "\n";
}