//    pos    = 当前处理的位置(一般从高位到低位)
2 // pre = 上一个位的数字(更高的那一位)
3 // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回,
4 //    给计数器+1。
5 // limit = 是否受限,也即当前处理这位能否随便取值。如567,当前处理6这位,
6 //    如果前面取的是4,则当前这位可以取0-9。如果前面取的5,那么当前
7 //    这位就不能随便取,不然会超出这个数的范围,所以如果前面取5的
8 //    话此时的limit=1,也就是说当前只可以取0-6。
9 //
10 // 用DP数组保存这三个状态是因为往后转移的时候会遇到很多重复的情况。
11 int dfs(int pos,int pre,int status,int limit)
12 {
13 //已结搜到尽头,返回"是否找到了答案"这个状态。
14 if(pos < 1)
15 return status;
16
17 //DP里保存的是完整的,也即不受限的答案,所以如果满足的话,可以直接返回。
18 if(!limit && DP[pos][pre][status] != -1)
19 return DP[pos][pre][status];
20
21 int end = limit ? DIG[pos] : 9;
22 int ret = 0;
23
24 //往下搜的状态表示的很巧妙,status用||是因为如果前面找到了答案那么后面
25 //还有没有答案都无所谓了。而limti用&&是因为只有前面受限、当前受限才能
26 //推出下一步也受限,比如567,如果是46X的情况,虽然6已经到尽头,但是后面的
27 //个位仍然可以随便取,因为百位没受限,所以如果个位要受限,那么前面必须是56。
28 //
29 //这里用"不要49"一题来做例子。
30 for(int i = 0;i <= end;i ++)
31 ret += dfs(pos - 1,i,status || (pre == 4 && i == 9),limit && (i == end));
32
33 //DP里保存完整的、取到尽头的数据
34 if(!limit)
35 DP[pos][pre][status] = ret;
36
37 return ret;
38 } 转载自:http://www.cnblogs.com/xz816111/p/4809913.html

转载:数位DP模板的更多相关文章

  1. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

  2. POJ 3286 How many 0's(数位DP模板)

    题目链接:http://poj.org/problem?id=3286 题目大意: 输入n,m,求[n,m]的所有数字中,0出现的总数是多少,前导零不算. 解题思路: 模板题,设dp[pos][num ...

  3. 数位dp模板 [dp][数位dp]

    现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...

  4. 51nod 1009 数字1的数量(数位dp模板)

    给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1.   数位dp的模板题   ...

  5. 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...

  6. HDU - 4722 Good Numbers 【找规律 or 数位dp模板】

    If we sum up every digit of a number and the result can be exactly divided by 10, we say this number ...

  7. 数位dp 模板加例题

    概念:所谓数位"dp",是指对数字的"位"进行的与计数有关的DP.一个数一个位,十位,百位,千位等,数的每一位就是数位.数位DP用来解决与数字操作有关的问题.例 ...

  8. 【hdu6148】Valley Numer【数位dp模板题】

    题意 对于每组数据给出一个整数n(length(n)<=100),找出不大于n的数字中有多少是Valley Numer.对于Valley的定义是它每一位的数字要么是递增,要么是递减,要么是先递减 ...

  9. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  10. HDU 2089 不要62 数位DP模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...

随机推荐

  1. Java 反射 Array动态创建数组

    Java 反射 Array动态创建数组 @author ixenos 注:java.lang.reflect.Array 是个反射工具包,全是静态方法,创建数组以多维数组为基准,一维数组只是特殊实现 ...

  2. 解决VM安装VMTools后错误提示,实现文件共享

    在VM里给Red Hat 9.0安装VMTools后重启,在系统启动过程中出现三处提示,分别为:第一处:Mounting local filesystem: Error: Cannot mount f ...

  3. HDU 2102 A计划(DFS)

    题目链接 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主 ...

  4. Codeforces Round #256 (Div. 2) B Suffix Structures

    Description Bizon the Champion isn't just a bison. He also is a favorite of the "Bizons" t ...

  5. css3的特效拓展...

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. intellij中javax包的导入

    新建intellij的maven web想项目的时候,出现的问题,import javax.servlet.http相关的包出错 好久不搭建也好久没用intellij了,都忘了,在这里笔记一下 再次吐 ...

  7. tableIView 区头的一点问题

    要记得设置区头的高度 否则会出现第一行没区头问题

  8. dom小总结

    DOM是W3C的标准,分为3个不同的部分: 核心DOM:针对任何结构化文档的标准模型,XML DOM:针对XML文档的标准模型,HTML DOM:针对HTML文档的标准模型. HTML DOM中所有事 ...

  9. ubuntu server 时区设置问题解决

    1.当执行此命令的时候 ntpdate us.pool.ntp.org 出现一下错误提示 name server cannot be used: Temporary failure in name r ...

  10. scanf函数与scanf_s函数

    ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存泄露.所以vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提 ...