<Atcoder - 161D> 数位dp
https://atcoder.jp/contests/abc161/tasks/abc161_d
题意:
定义一种数 lun number:该数任意相邻的两个数位差的绝对值不超过1
比如 123,234,12121,1010 都是 lun number;而 256,18,102 都不是 lun number
输入1e5以内的 k ,输出第 k 小的 lun number 的值
思路:
设dp[i][j]表示最高位是i, 位数是j的lun number的个数
根据极限样例, j最多为10位, i在0 ~ 9
首先初始化所有dp[i][1] = 1 (以i开头的一位数就是i本身, 只有1个)
转移方程3种情况:
1) dp[i][j] = dp[i][j - 1] + dp[i + 1][j - 1];
//最高位i = 0时的j位数只能以i和i + 1作最高位的j - 1位数作为后缀
2) dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
//最高位i = 9时的j位数只能以i - 1和i作最高位的j - 1位数作为后缀
3) dp[i][j] = dp[i - 1][j - 1]