1、数位 dp 是一种计数用的 dp,一般就是要统计一个区间 le,ri内满足一些条件数的个数。比如,1,10000 中统计不含有 4 的数 。所谓数位 dp,字面意思就是在数位上进行 dp 咯。就是对数字每一位每一位递推此类题目最基本的暴力方法:1. for(int i=le;i 2. #include 3. #include 4. #include 5. using namespace std; 6. int d1010,digit10; 7. /dij 表示有 i 位数字,且第一位是 j 的数字的 满足题意的数量 8. void init() 9. 10. d00=1; 11. for(in
2、t i=1;i=1;i-) 27. for(int j=0;jnm,n+m) 41. coutsolve(m+1)-solve(n)endl;/由于要找n,m,而 solve 函数找的范围为n,所以传参的时候应该特别注意 42. return 0; 43. 假设一个数 3229得出00000999 的个数10001999 的个数20002999 的个数000099 的个数100199 的个数0099 的个数1019 的个数08 的个数累加就是答案了所以该区间是0,n) 是取不到的 n 的,注意计算的时候要加一个 1下面是一些题目:HDU 2089 不要 62 和 4HDU 3555 含 49
3、的数HDU 3652 含 13 且可以被 13 整除codeforces 55d A 一个数字可以被它所有非零数整除的个数POJ 3252 Round Numbers HDU 4734 F(x)HDU 3709 Balanced NumberHYSBZ 1799 self 同类分布URAL 1057 Amount of Degrees *HDU 4507 吉哥系列故事 恨 7 不成妻 *总结:可能要用到的数位 DP 的题目类型:11018,求某区间(很大),有特定要求的数字的个数如求 mod,求和,可以整除各位数,不出现某些数.框架:int DFS(int pos,) /DFS 一位一位放数字,求出答案,函数的参数保存题目要求的状态int solve(int n) /把 n 一位一位拆分,求出1,n 的符合要求的值难点:定义好状态!1.dp 状态要找好,不要出现状态重叠现象,注意前导 0 有没有影响2.题目有求和 sum,可能会很大,但可以转化为保存 sum 对一个数求 mod 的值3.有时候 dp 状态定义不好可能要求每次 DFS 都要 memset 一下,换换思路想想通用的状态定义,如 sum 从 加法改为减法