所谓数位dp,字面意思就是在数位上进行dp,数位的含义:一个数有个位、十位、百位、千位、等等,数的每一位就是数位。
数位DP一般应用于:
求出给定区间[A,B]内,符合条件P[i]的数 i 的个数。
条件P[i]一般与数的大小无关,而与 数的组成 有关
其实质就是换一种暴力枚举的方式,使得新的枚举方式满足dp的性质,然后记忆化就可以了。
 
参考来自以下链接
 

 
HDU 2089为前提讨论,题目大意为,多组数据,每次给定区间[n,m],求在n到m中没有"62"或"4"的数的个数。
试想:我们如果能有一个函数count(int x),可以返回[0,x]之间符合题意的数的个数。那么是不是直接输出count(m) - count(n-1)就是答案?
 
DP老规矩,先开一个二维数组f[][]。(dp的本质就是空间换时间)
f[i][j],表示 i 位数,最高位是 j 的数,符合题意的数有多少个。比如说f[1][2]=1;f[1][4]=0; f[2][6]=8;(60,61,63,64,65,66,67,68,69)。
 
我们先不关注这个 f 有什么用,我们先关注这个 f 如何来求。首先f[1][i] = 0;(if i==4),f[1][i]=1;(if i!=4)(0<= i <=9)。
以上这步是很显然的,那么根据这个题的数据范围,只需要递推到f[7][i]就行了。那么稍微理解一下就可以想出递推式:
if (j == 4) f[i][j] = 0;
else if (i != 6)f[i][j] = Σf[i - 1][j] (j = 0, 1, 2, 3, 5, 6, 7, 8, 9);
else if (i == 6)f[i][j] = Σf[i - 1][j] (j = 0, 1, 3, 5, 6, 7, 8, 9);
 
 
这里需要说明一下的是关于首位为 0 的情况,认为00052是长度为5,首位为0的符合条件的数,052是长度为3首位为0符合条件的数,自己在手推的时候就把0去掉了,怎么都看不出递推的规律。
 
那么我们现在得到了f数组,在重申一下它的定义:f[i][j]表示 i 位数,最高位是 j 的数,符合题意的数有多少个。
 

 
第二步就要关注怎么利用f数组做出上面我们说的那个函数count(int x),他们可以求出[0,x]中符合题意的数有多少个。
 
那么我们做一个函数int solve(int x) ,它可以返回[0,x)中符合题意的有多少个。那么solve(x+1)实际上与count(x)是等价的。
那么现在问题转化成了:小于x的,符合题意的数有多少个?
既然小于,从最高为开始比,必定有一位要严格小于x(前面的都相等)。所以我们就枚举哪一位严格小于(前面的都相等)。假设我们把x分为a1,a2,a3,.....,aL这样一个数组,长度为L,最高位为aL。
那么结果实际上就是这样:长度为L,最高位取[0,aL - 1]的所有符合题意的数的和,然后再加上长度L-1,最高位为[0,aL-1 - 1]的数,一直累加到最后长度为1或者碰到了4或该位是2上一位是6的情况也可以停止

初学数位DP的更多相关文章

  1. hdu 2089 不要62(初学数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给定 m,.n; 求车牌号 m~n之间 有多少数字 不含 4或62     ,8652是可以的 . ...

  2. 动态规划晋级——HDU 3555 Bomb【数位DP详解】

    转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数 ...

  3. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  4. bzoj1026数位dp

    基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...

  5. uva12063数位dp

    辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...

  6. HDU2089 不要62[数位DP]

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

  7. 数位DP GYM 100827 E Hill Number

    题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...

  8. 数位dp总结

    由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...

  9. 数位DP入门

    HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...

随机推荐

  1. c语言程序设计案例教程(第2版)笔记(二)—函数、递归

    零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...

  2. Fighting

    class Demo { public static void main(String[] args) { int a=3,b=8; int c=(a>b)?a++:b++; System.ou ...

  3. Android偏好设置(4)设置默认值

    Setting Default Values The preferences you create probably define some important behaviors for your ...

  4. APP多渠道打包

    多渠道打包的概念: 打包是指使用证书文件对app签名生成一个apk文件. 多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场.百度市场等,为了统计应用在各个市场的 ...

  5. sdut1933WHUgirls(dp)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933 矩形的dp一般挺类似  大的矩形都是由小 ...

  6. 配置Oracle监听器

    Oracle的监听和网络服务都可以在Net Manager中配置,如下图.也可以在上面的那个Net Configuration Assistant中配置,只是Net Manager比较方便些. Ora ...

  7. SQLServer 2012 高效分页

    SQLSERVER2012 出新分页功能啦!!!近两天我在自己工作机的PC(没有并发,单一线程)上做了SqlServer  2000/ (2005/2008)/2012三个版本下的分页性能比较. 大致 ...

  8. 阿里云OSS搭建移动应用直传服务的.Net C#示例

    OSS好几个都没有.Net示例,只有SDK 于是我就拿Java改成C#代码:使用前先去Nuget包管理器下载Aliyun.Acs.Core还有Aliyun.Acs.Sts: 在安装这个两个包的时候安装 ...

  9. (七)Mybatis总结之注解开发

    请移步到 https://www.cnblogs.com/lxnlxn/p/5996707.html

  10. CF915C Permute Digits

    思路: 从左到右贪心放置数字,要注意判断这个数字能否放置在当前位. 实现: #include <bits/stdc++.h> using namespace std; typedef lo ...