bzoj 1026
bzoj 1833
bzoj 2431
hdu 3555
bzoj 3209
bzoj 1662
这两天做了一下数位dp 的题, 总结一下。
数位dp 一般就是给你一个数x, 然后让你求出 在 1 ~ x 中符合特定条件的数有多少。
比较通用的解题思路就是先预处理出一个 f 数组, 表示前 i 位, 首位 为 j 的方案数。
然后就可以开始计算啦:
先 把长度为 1 ~ len - 1 的数都算出来, 这时候以任意一个数开头都是可以的。
然后处理 长度 和 x 相同的数, 这时候我们必须知道前面那些位 有没有满, 这样才能确定 这一位有多少种选择的方案。
不妨分别枚举 前 1 ~ len - 1 位 满了的情况, 即这时候 的前 i 位就是 x 的前i 位, 这时候再枚举一个可用的 j , 然后判断这个j 放在这里是否可行, 可行的话 ans += f[l - i + 1][j];
值得注意的是边界 , 即 i = 1 或 i = len 的时候, 通常会很乱, 如果思路不清晰的话就会跪。