动态规划专题(三)——数位DP
前言
数位\(DP\) 真的是最恶心的\(DP\)。
简介
看到那种给你两个数,让你求这两个数之间符合条件的数的个数,且这两个数非常大,这样的题目一般就是 数位\(DP\) 题。
数位\(DP\)一般都用于计数。
具体实现
数位\(DP\)有两种实现方法:\(DP\)预处理+乱搞求答案以及记忆化搜索。
个人感觉用记忆化搜索来实现要比较容易一些(第一种做法我是真的不会)。
数位\(DP\)在求解的过程中运用了前缀和的思想,即要求\(l\sim r\)范围内的解的个数,就相当于用\(0\sim r\)范围内的解的个数减去\(0\sim 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数组为-1
inline int GetAns(int x) {return (void)(Init(x)),dfs(len,0,0);}//将这个数按位保存下来,然后记忆化搜索求解
}DigitalDP;
几道例题
照常贴几道例题:
第一道例题: 【BZOJ3209】花神的数论题
一道二进制的数位\(DP\),可以发现用\(DP\)预处理得到的是一个杨辉三角形... ...
第二道例题: 【BZOJ1833】[ZJOI2010] count 数字计数
比较经典的数位\(DP\)题,关键在于要判前导\(0\)。
第三道例题: 【HDU4507】恨7不成妻
应该是这几道题里我唯一一道写记忆化搜索的,需要加上一点恶心的数学转化。
动态规划专题(三)——数位DP的更多相关文章
- 【专题】数位DP
[资料] ★记忆化搜索:数位dp总结 之 从入门到模板 by wust_wenhao 论文:浅谈数位类统计问题 数位计数问题解法研究 [记忆化搜索] 数位:数字从低位到高位依次为0~len-1. 高位 ...
- UESTC 884 方老师的专题讲座 --数位DP
定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...
- [专题总结]数位DP
总结: 1:第i个数符合要求了,所以接下来的数都可以.如果没限制, 那么是有 10i-1 个.如果有限制,那么是 (nowx % 10i-1)+1 . 2:两种状态设置 有设状态d ...
- 「动态规划」-数位dp专题
数位dp,今天学长讲的稍玄学,课下花了一会时间仔细看了一下,发现板子是挺好理解的,就在这里写一些: 数位dp主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...
- 有关动态规划(主要是数位DP)的一点讨论
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家在研究多阶段决策过程的优化问题时, ...
- [kuangbin带你飞]专题十五 数位DP
ID Origin Title 62 / 175 Problem A CodeForces 55D Beautiful numbers 30 / 84 Problem B HD ...
- 数位DP专题
这周开始刷数位DP,在网上找到一份神级数位DP模板,做起题目来爽歪歪. http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html in ...
- 动态规划——数位dp
通过先前在<动态规划——背包问题>中关于动态规划的初探,我们其实可以看到,动态规划其实不是像凸包.扩展欧几里得等是具体的算法,而是一种在解决问题中决策的思想.在不同的题目中,我们都需要根据 ...
- 专题训练之数位DP
推荐以下一篇博客:https://blog.csdn.net/wust_zzwh/article/details/52100392 1.(HDOJ2089)http://acm.hdu.edu.cn/ ...
随机推荐
- java知识点积累(一)
知识点积累 1.关于final的重要知识点: final关键字可以用于成员变量.本地变量.方法以及类: final修饰的成员变量必须在声明时被初始化,或者在构造器中初始化,否则就会报编译错误: 不能够 ...
- Git练习2 使用码云
- Exadata 上关于SAS盘的小秘密
案例概述 一个X3-2 的Exadata临时客户,ORACLE原厂工程师在进行onecommand初始化的过程中,执行到第6步,calibrate检测存储节点磁盘性能时报错,后续工作无法继续.而由于一 ...
- PAT甲级——1096 Consecutive Factors (数学题)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/91349859 1096 Consecutive Factors ...
- git教程2-git基础
clone 使用IDE,直接在vcs里,从git checkout,方便. commit commit是提交到本地git仓库,本质是做一次存储快照. 可以多次commit之后,再次push到git服务 ...
- webfont应用系列(二)如何制作图标字体?
工具: Adobe Illustrator CS5 Fontographer 5.1,下载地址 1.打开Fontographer,菜单"File"->"New&qu ...
- docker nginx部署.net core后端站点和angular前端站点
首先声明,服务器是linux 版本是ubuntu server 18.04,不是windows server.windows server 2016放弃治疗了,2019可能会有改善,不过云厂商的公共镜 ...
- E - Palindrome Numbers
题目链接:https://vjudge.net/contest/237394#problem/E A palindrome is a word, number, or phrase that read ...
- Maven插件和细节
1.父工程统一版本号 <!-- 集中定义依赖版本号 --> <properties> <junit.version>4.12</junit.version&g ...
- Unity GL 画圆
Unity下GL没有画圆的函数,只能自己来了. 如果能帮到大家,我也很高兴. 虽然没有画圆的函数,但是能画直线,利用这一点,配合微积分什么的,就可以画出来了.反正就是花很多连在一起的直线,每条直线足够 ...