所谓数位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. Linux的防火墙概念

    #linux的防火墙概念#因为如果你不关防火墙,很可能运行 django.nginx.mysql出错#防火墙可能会阻挡端口流量的 出口#也会阻挡外来请求的 入口 #selinux iptables f ...

  2. poj 2195 Going Home (km算法)

    题目链接: http://poj.org/problem?id=2195 解题思路: 把man和home都提取出来,然后算出每个man和home的距离算出来,然后建立匹配图,套用km算法的模板,求最小 ...

  3. 51nod 1874 字符串排序

    1874 字符串排序  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和.比如&q ...

  4. QT如何发布程序

    QT如何发布程序转载 http://blog.csdn.net/iw1210/article/details/51253458

  5. 题解报告:hdu 2544 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t ...

  6. Eclipse快捷键集合

    ***eclipse查看哪个方法被调用:选中,右键选择Open call Hierarchy     选择要查看的方法: ctrl + alt + h       查看一个类被那些类继承或者实现: F ...

  7. Android最简单的实例 :环境搭建及HelloWorld

    Android开发之旅:环境搭建及HelloWorld 2010-04-12 00:45 by 吴秦, 883961 阅读, 140 评论, 收藏,  编辑 ——工欲善其事必先利其器 引言 本系列适合 ...

  8. iOS 集成银联支付(绕过文档的坑,快速集成)-转

    本文是投稿文章,作者:南栀倾寒当初集成支付宝的时候,觉得见了这么丑的代码,加上这么难找的下载地址,在配上几乎为零的文档,寒哥就要吐血了. 下午去集成银联,才知道血吐的早了. 下载地址:https:// ...

  9. C. Timofey and a tree 观察题 + dfs模拟

    http://codeforces.com/contest/764/problem/C 题意:在n个顶点中随便删除一个,然后分成若干个连通子图,要求这若干个连通子图的颜色都只有一种. 记得边是双向的, ...

  10. openmv第一次调试

    2018-09-19  20:14:51 import sensor, image, time import car import json import time from pyb import U ...