数位 DP 严格来说其实并不是 DP……它只是个单纯的计数问题

但是怎么说呢……现在大家似乎都把数位 DP 叫这个名字,所以……我们还是……叫它 DP

额什么是数位 DP 呢?

一句话概括——一类求在 K 进制下m满足条件的数的数量有多少个的算法

常见的问题形式:

求 [l..r] 之间的在 K 进制下满足条件 F 的数有多少个?

什么?你说for (int i = l ; i <= r; i++) ans+=check(i);?

别学竞赛了,回家养鲲吧

我们很快就会发现,数位 DP 的复杂度和位数相关,所以一般数据规模奇大

(以上摘自lyd课件)

数位DP

(以下基于k进制讨论)

数位DP一般会让你求\([l,r]\)满足条件的个数,这里我们设函数\(c(x)\)表示小于x的正整数中满足条件的个数,则最终答案就是 \(c(r+1)-c(l)\) 。但k进制时加一操作不一定好实现,所以更常用的是 \(c(r)-c(l)+\text{对r的特判结果}\)。

所以问题转化为求\(c(x)\)。

正如它名字中的“数位”,DP状态的第一维通常是数字的位数。所以只要写出转移方程,就可以得到小于\(k^x\)的满足条件的个数(其中x是任意/给定正整数)即\(\sum dp[x][...]\)

现在要求\(c(x)\)。设\(x\)有\(l\)位,且现在已经求得了\(dp[l-1][...]\)。现在考虑最高位,分为两种不同的情况:

  1. 满足条件的y的最高位小于x的最高位。这时能保证\(y<x\),所以后面任意选。

  2. 满足条件的y的最高位等于x的最高位。这时可以递归解决后面的位构成的子问题。但我们发现递归完全是浪费,因为子问题求出的dp数组是一样的。所以在子问题中真正有用的是求情况1和递归下一层。

    因为递归的层数是递减的,于是我们可以把递归改为循环。


上面这些抽象的描述说实话我都看不懂QAQ

考虑这样的一道题目:求\([l,r]\)中不包含4和62的数的个数。

那么就可以设\(c(x)\)为小于\(x\)的数中不包含4和62的数的个数,最终答案即为\(c(r+1)-c(l)\)。

这里可以设\(dp[i][j]\)表示长度为i位的,最高位是j的满足条件的数的个数。然后我们可以写出这样的转移方程:\(dp[i][j](j\neq4)=sum\{dp[i-1][k]|\text{当}j=6\text{时}k\neq2\}\)

下面假设xl位,最高位是x[1],最低位是x[l],其他类似。这一段代码求出了dp数组。

for(int j=0;j<=9;j++){if(j==4)continue;dp[1][j]=1;
}
for(int i=2;i<=l;i++){for(int j=0;j<=9;j++){if(j==4)continue;for(int k=0;k<=9;k++){if(j==6&&k==2)continue;dp[i][j]+=dp[i-1][k];}}
}

然后考虑情况一。

int ans=0;
for(int j=0;j<x[1];j++){if(j==4)continue;ans+=dp[l][j];
}

然后是情况二。先写递归版。(toint表示将数组表示的数字转换成int,toarr则相反)

ans+=c(从前面去掉1位的x);

这时我们可以发现,在第一次递归里有用的代码是如下的部分:

for(int j=0;j<x[2];j++){if(j==4||(j==2&&x[1]==6)continue;ans+=dp[2][j];
}
ans+=c(从前面去掉2位的x);

所以最终我们应该把代码修改为这样子:

int ans=0;
for(int i=l;i>=1;i--){for(int j=0;j<x[l-i+1];j++){if(j==4||(j==2&&x[l-i]==6))continue;ans+=dp[i][j];}
}

转载于:https://www.cnblogs.com/water-lift/p/10809884.html

(待完成)qbxt2019.05 总结2 - 数位DP相关推荐

  1. HDU2089 不要62【数位DP+记忆化搜索】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. 1587 例题3 [SCOI2009] Windy 数(Bzoj1026 LOJ LUOGU2657 提高+/省选-) 需考虑前导0的数位DP

    总目录 在线测评地址(ybt) 在线测评地址(LOJ) 在线测评地址(LUOGU) 需考虑前导0的数位DP 以下内容,可以结合后续的AC代码进行阅读. dp[pos][pre]代表的是什么意思? po ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  5. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  6. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  7. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

  8. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

  9. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

最新文章

  1. 凌轩:中国电信在校园市场的困与囧
  2. npoi xlsx 文件损坏_解决右键新建xlsx文件错误
  3. [linux-nopage]内存映射虚拟字符设备驱动【P119】
  4. Logdump使用指引
  5. 测试用例设计技术之一等价类法
  6. [胡思乱想]网络游戏与社会资源公平分配
  7. windows ftp服务器_ftp是什么意思,在windows系统安装ftp只需3步
  8. (Greedy approach)Find longest word in dictionary that is a subsequence of a given string
  9. 计算机报警声 一高一低,有报警声电脑问题怎么处理 有报警声电脑问题处理方法【介绍】...
  10. 【C++函数】strcat()
  11. Java根据isbn查询图书信息_isbn书号查询api,根据图书ISBN查询详细信息
  12. 【哈利波特】Sherbert Lemon对HP的解读之10
  13. core dumped ?完了?
  14. js bookmark doubanfm lyrics
  15. 如何在WorkNC中快速建立坐标管理器
  16. Android7.0+安装apk文件之后不弹出安装完成的界面解决办法
  17. 用 Adobe 设置 PDF 文件在文件管理器右侧预览窗格预览
  18. wannier拟合能带总是拟合不上_科学网-Wannier90输入文件中num_wann, num_bands, 和energy window等参数设置规则-李云海的博文...
  19. 由IRR看超越方程求解
  20. android 电视怎么投屏,手机怎么投屏到电视?原来这么简单

热门文章

  1. 西澳大学商科专业排名_澳洲西澳大学优势专业排名多少
  2. linux python3运行,将Python3安装到Linux上并运行
  3. dual mysql 获取序列_MySQL JDBC客户端反序列化漏洞
  4. STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结
  5. android自动软键盘,Android自定义软键盘
  6. mysql权限说法正确的是,【多选题】下面关于修改 MySQL 配置的说法中,正确的是...
  7. Java中lombok @Builder注解使用详解
  8. 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
  9. java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big解决方法
  10. Error:java: 无效的目标发行版: 11解决方案