前言

数位DPDPDP 真的是最恶心的DPDPDP。


简介

看到那种给你两个数,让你求这两个数之间符合条件的数的个数,且这两个数非常大,这样的题目一般就是 数位DPDPDP 题。

数位DPDPDP一般都用于计数


具体实现

数位DPDPDP有两种实现方法:DPDPDP预处理+乱搞求答案以及记忆化搜索

个人感觉用记忆化搜索来实现要比较容易一些(第一种做法我是真的不会)。

数位DPDPDP在求解的过程中运用了前缀和的思想,即要求l∼rl\sim rl∼r范围内的解的个数,就相当于用0∼r0\sim r0∼r范围内的解的个数减去0∼l−10\sim l-10∼l−1范围内解的个数即可。


模板

贴一波记忆化搜索的模板:

class Class_DigitalDP//数位DP(记忆化搜索实现)
{private:#define Size 15//如果是int范围内,数字长度不会超过15,这个Size要视题目而定int len,num[Size],f[Size][10];//len存储数字长度,num记录数字的每一位,f则用于记忆化inline void Init(LL x) {len=0;while(x) num[++len]=x%10,x/=10;num[len+1]=0;}//初始化,将x这个数字按位保存下来inline int dfs(int x,int s,int flag)//x记录剩余的位数,s记录当前的状态,flag记录当前是否肯定在求解的范围内(0表示不一定,1表示一定){register int i,lim=9,w=0;//w用于统计答案if(!x) return OK(s);//如果剩余位数为0,就判断当前状态是否满足条件,并退出函数if(flag&&~f[x][s]) return f[x][s];//如果当前状态肯定在求解范围内,且已访问并求解过当前状态,就返回曾经求解出的答案if(!flag) (Right(num[x])&&(w+=dfs(x-1,GetStatus(s,num[x]),0),0),lim=num[x]-1;//如果不保证在求解范围内,则对这一位上的最大值单独处理,并仍不能保证在求解范围内for(i=0;i<=lim;++i) if(Right(i)) w+=dfs(x-1,GetStatus(s,i),1);//枚举每一个数字,如果这个数字符合条件,就继续搜索if(flag) f[x][s]=w;//如果当前状态肯定在求解的范围内,就将求解出的答案记录下来,实现记忆化return w;//返回答案}public:Class_DigitalDP() {for(register int i=0,j;i<Size;++i) for(j=0;j<9;++j) f[i][j]=-1;}//初始化f数组为-1inline int GetAns(int x) {return (void)(Init(x)),dfs(len,0,0);}//将这个数按位保存下来,然后记忆化搜索求解
}DigitalDP;

几道例题

照常贴几道例题:

第一道例题: 【BZOJ3209】花神的数论题

一道二进制的数位DPDPDP,可以发现用DPDPDP预处理得到的是一个杨辉三角形… …

第二道例题: 【BZOJ1833】[ZJOI2010] count 数字计数

比较经典的数位DPDPDP题,关键在于要判前导000

第三道例题: 【HDU4507】恨7不成妻

应该是这几道题里我唯一一道写记忆化搜索的,需要加上一点恶心的数学转化。

LinkLinkLink

【BZOJ3209】花神的数论题 的题解 详见博客 【BZOJ3209】花神的数论题(数位DP)

【BZOJ1833】[ZJOI2010] count 数字计数 的题解 详见博客 【BZOJ1833】[ZJOI2010] count 数字计数(数位DP)

【HDU4507】恨7不成妻 的题解 详见博客 【HDU4507】恨7不成妻(数位DP)

动态规划专题(三)——数位DP相关推荐

  1. 动态规划之六:数位dp(未完)

    数位dp 要求区间[l,r]之间符合某种性质的个数时,用f[k]表示0~k之间满足某种性质的个数,那么区间[l,r]即可表示为f[r] - f[l - 1]. 例题一 求给定区间 [X,Y] 中满足下 ...

  2. 【动态规划】【数位DP】[PA 2015]Rownanie

    题目描述 对于一个正整数 n,定义 f(n) 为它十进制下每一位数字的平 方的和. 现在给定三个正整数 k,a,b,请求出满足 a≤n≤b 且 k×f(n) = n 的 n 的个数. 1≤k,a,b≤ ...

  3. 动态规划 —— 数位 DP

    [概述] 数位 DP 实际是一种计数用的 DP,一般就是统计一个区间 [le,ri] 内满足一些条件数的个数. 所求的限定条件往往与数的位数有关,例如:数位之和.指定数码个数.数的大小顺序分组等. 题 ...

  4. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  5. 牛客网dp专题 数位dp

    文章目录 数位dp 例题: NC116652 uva11038 How many 0's NC15035 送分了QAQ NC20669 诡异数字 NC20665 7的意志 NC17385 Beauti ...

  6. 牛客网暑期ACM多校训练营(第三场): C. Chiaki Sequence Reloaded(数位DP)

    题目描述 Chiaki is interested in an infinite sequence a1, a2, a3, ..., which defined as follows: Chiaki ...

  7. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  8. 20200707:动态规划专题之不同路径

    动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...

  9. hihoCoder #1033 : 交错和 [ 数位dp ]

    传送门 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - ...

最新文章

  1. Thecus色卡司1U机架式网络存储服务器
  2. jQuery 元素操作——遍历元素
  3. android通过webservice连接SQL数据库(二)客户端
  4. 单调队列优化的背包问题
  5. os.system和os.popen函数的区别
  6. 字幕/打轴/压制小tip——Aegisub MeGUI 极简操作指南
  7. 爬取笔趣阁《斗破苍穹》小说,只需改一下网址,笔趣阁所有小说任意下载
  8. 如何写出有吸引力的软文?经典软文案例分析
  9. 制作u盘版的kail linux 系统,即插即用,用于破解邻居妹子家的wifi
  10. 彻底删除spacedesk
  11. 支付宝给微信好友转账!转了?好像又没转
  12. MS Office for Mac的Clipart错误
  13. 整数转罗马数字(C++)
  14. MS2109高清采集卡 HDMI转USB2.0免驱,支持MJPEG YUV数据格式 demo原理图介绍
  15. windows10专业版 hyper-v
  16. ¥1-1 SWUST oj 941: 有序顺序表的合并操作的实现
  17. 如何秒下单?python的淘宝秒杀抢购下单源码参考
  18. 做自己的心理医生PDF电子书
  19. 寻找孪生素数 (20 分)
  20. 协整检验——进出口与经济增长

热门文章

  1. Win系统 - 怎么样卸载 Win10 更新补丁,如何删除系统安全补丁
  2. 328个计算机毕业设计题目
  3. uniapp 下拉列表插件 lable问题
  4. Redis Cluster节点添加/删除实录
  5. java实现文本纠错功能_调用百度API进行文本纠错
  6. 苹果审核2.1解决方案
  7. logback使用配置详解
  8. 程序员的思维修炼读书笔记(二)
  9. Android Oreo 常见问题 3.0 | Android 开发者 FAQ Vol.11
  10. 阿里老兵深度雄文:不懂这些,你的复盘都是白费功夫!