所谓数位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. centos 允许远程连接mysql

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

  2. 组合游戏 - SG函数和SG定理

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  3. [转]在asp.net mvc中使用PartialView返回部分HTML段

    本文转自:http://blog.csdn.net/sandy945/article/details/6307750 问题链接: MVC如何实现异步调用输出HTML页面 该问题是个常见的 case, ...

  4. (六)SpringIoc之延时加载

    Spring容器初始化时将所有scope = singleton的bean进行实例化. 通常情况下这是一件好事,因为这样在配置中的错误会更容易发现.但是如果不想spring容器初始化就实例化就要用到延 ...

  5. 如何看Spring源码

    想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框架,而且是基于Java Config形式的零配置Spring框架. 首 ...

  6. Spring框架学习-搭建第一个Spring项目

    步骤一:下载Spring开发包. 官网:https://spring.io/           下载地址:https://repo.spring.io/libs-release-local/org/ ...

  7. html5改良的input元素的种类

    1.url类型.email类型.date类型.time类型.datetime类型.datetime-local类型. month类型.week类型.number类型.range类型.search类型. ...

  8. Android学习笔记(十五) Http

    1.Http协议概要 应用程序和服务间的请求/响应是无状态的,即响应完即断开连接. HttpClient库是Android自带的,故无需引入该库 2.Http请求和获取数据 生成代表客户端的HttpC ...

  9. Sass的的使用三

    [Sass]普通变量与默认变量普通变量定义之后可以在全局范围内使用. 默认变量sass 的默认变量仅需要在值后面加上 !default 即可.sass 的默认变量一般是用来设置默认值,然后根据需求来覆 ...

  10. LeetCode887鸡蛋掉落——dp

    题目 题目链接 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去,如果没有碎可以继续使用.你知道存在楼层 F , ...