这不是一篇介绍数位dpdpdp的文章,只是我思考后的一些记录,怕以后就忘记了。
由于博主太菜不会组合数学,以下数位dpdpdp均采用记忆化搜索的方式。
首先最重要的就是状态设计了,正常来说数位dpdpdp的状态设计需要包含数的结构和状态。
数位dpdpdp的复杂度可以简单理解为开的数组的大小。
对于数位dpdpdp有两种理解:
第一种: dpdpdp的状态只与当前数的位数以及要维护的状态有关。在这种理解方式下,dpdpdp状态设计通常为f[pos][state]f[pos][state]f[pos][state],由于状态中并未规定上下界,所以对于每次查询操作,并不需要将其dpdpdp数组清成−1-1−1,这样在应对多组查询的时候可能会快一点。在记忆化的时候需要加上flag1...flag1...flag1...等限制上界的变量是否为111,即当前位是否可以选任意数,在多组测试情况下这个方法跑的还可以。当然这个只跑的快只能在维护一个数的时候跑的快,如果你要维护一对数,那么记忆化的时候flag1&&flag2flag1 \And\And flag2flag1&&flag2才能记忆化,这样的话就会慢很多,导致TLETLETLE,所以当维护两个数及以上的时候最好不要用这种记忆化方式。
写成的代码大概是这样的:

if(f[pos][state]!=-1&&flag) return f[pos][state];
if(flag) f[pos][state]=ans;
return ans;

第二种: 在状态中加入0/10/10/1表示是否达到上界,即上文中的flag1,flag2...flag1,flag2...flag1,flag2...,这样的话由于每次询问的数都不同,所以每次都需要将fff数组置为−1-1−1才能记忆化,这样的优点和缺点相比于上面的方式很明显,优点就是这个状态设计能记录f[pos][state][0]f[pos][state][0]f[pos][state][0]的信息,即如果当前位不能自由选也可以记忆化,而上面的只能记录下来f[pos][state][1]f[pos][state][1]f[pos][state][1]的信息,只不过我们将最后一维省略了。缺点也比较明显,每次都需要初始化fff数组,让后重新dpdpdp一次,不过也不会太慢。
写成代码大概是这样的:

if(f[pos][state][flag]!=-1) return f[pos][state][flag];
return f[pos][state]=ans;

对于前导零:
当涉及到对数的结构特点进行维护的时候就有可能需要维护一个前导零了。比如说求[l,r][l,r][l,r]内有多少个数的位数中含kkk个000,这个时候如果不维护一个前导零的话会将如001000100010中前面两个000也算入答案,这显然是不正确的。

数位dpdpdp很多题目求贡献的话都是按位或者按照数来求的。

做过的例题:
2020 ICPC 上海 Sum of Log 数位dp + 优化状态
hdu 6899 Xor 数位dp
FZU - 2042 The Mad Mathematician 数位dp + 算贡献

暂时先更这些,后面有更好的理解会补充。

对数位dp的一些拙见相关推荐

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

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

  2. 不要62 ---数位DP

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

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

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

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

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

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

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

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

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

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

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

  8. 数位dp ---- 2020 icpc 上海 Sum of Log(枚举高位的二进制数位dp)

    题目链接 题目大意 : 解题思路: 这里有个很核心的地方就是log2(i+j)\text{log2(i+j)}log2(i+j)本质上就是看看i+j\text{i+j}i+j的二进制高位在哪里? 那么 ...

  9. 数位dp ---- 暴力 + 二进制的数位dp 2020济南 L Bit Sequence

    题目链接 题目大意 f(x)=x的二进制中1的个数f(x)=x的二进制中1的个数f(x)=x的二进制中1的个数 给你一个数组[a1,a2,a3...,am]m∈[1,100][a_1,a_2,a_3. ...

最新文章

  1. PI校正环节的程序实现推导过程
  2. python使用符号#表示单行注释-Python中注释(多行注释和单行注释)的用法实例...
  3. 软件工程--团队作业4
  4. 大数据和云计算时代的机遇
  5. DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(笔记)
  6. 利用setTimeout方法控制JS中方法的执行顺序
  7. synchronized锁的升级
  8. SSClone非ARP会话劫持原理分析
  9. 【数据结构】二叉排序树
  10. 画面风格写实的飞鸽传书
  11. 在 Nginx 上支持 HTTP/3
  12. day9——函数初识
  13. C++ std::set operator <= find失效 erase失效 解决方案
  14. oracle linux 镜像下载|【最新】oracle linux 8.1官网镜像下载,让你下载oracle linux不被坑!
  15. LaTex中插入超链接
  16. 服务器删除的excel文件备份在哪里,microsoft excel备份文件在哪 - 卡饭网
  17. 小黄鸡 php,小黄鸡simsimi接口
  18. java获取中文首字母
  19. Competition2:HRZ学英语
  20. “浅尝”JavaScript设计模式

热门文章

  1. 每次有人来家里,总有人问我这个积木在哪买的
  2. 提升方法之AdaBoost算法
  3. set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输
  4. 楼层效果_1一28高楼最好最吉利的楼层是哪层?选楼层要注意什么?
  5. java jli.dll_JVM、JRE、JDK之间的区别和联系,你居然还不知道?
  6. kotlin中mainactivity无法直接调用xml中的控件_使用52North 客户端接口调用OGC WPS服务...
  7. iphone4 base64 mp3 无法解析 html5,javascript - 如何使用HTML5在firefox上播放base64音频数据? - 堆栈内存溢出...
  8. 计算机基础与应用教程计算机硬件,计算机基础系列一:计算机硬件
  9. JVM笔记(JVM内存+垃圾回收器)详解
  10. 7-11 租用游艇问题 (15 分)(思路+详解+一步步分析+网格解决动态规划问题)Come boy!!!!