//    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 泛型 泛型代码和虚拟机

    Java 泛型 泛型代码和虚拟机 @author ixenos 类型擦除.原始类型.给JVM的指令.桥方法.Java泛型转换的事实 l  类型擦除(type erasure) n  Java泛型的处理 ...

  2. libmad编译

    patch -Np1 -i ../libmad-0.15.1b-fixes-1.patch && sed "s@AM_CONFIG_HEADER@AC_CONFIG_HEAD ...

  3. Spring声明式事务配置中propagation各个值的意思

    值 含义 REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务. SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行. MANDATORY 支持当前事务,如果当前没有事务 ...

  4. HUST 1404 Hamming Distance(字符串)

    Hamming Distance Description Have you ever heard of the Hamming distance. It is the number of positi ...

  5. POCO系列之——延迟加载

    当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下,你可能只需要加载部分数据,或者你喜欢 ...

  6. iOS 数组字典操作

    iOS开发中需要大量对dictionary和array进行操作,因此我们需要一种更加安全可靠的操作方法来避免不必要的crash.当然可以通过自定义dictionary 和array重载增删改查的方法来 ...

  7. Xcode7修改模块生成网络权限(ATS配置)

    直接找    前往->前往文件夹->然后复制下面的路径填入框内,回车就能看到想要替换的文件夹了 /Applications/Xcode.app/Contents/Developer/Pla ...

  8. 调用Lua出错

    错误提示:Could not load file or assembly 'lua51' or one of its dependencies. An attempt was made to load ...

  9. Python笔记2-20151023

    一.循环 Python的循环有两种,一种是for...in循环,依次吧list或tuple中的每个元素迭代出来. >>>names = ['Michael','Bob','Tracy ...

  10. Echart图表相关配置项的设置

    饼状图提示框单位显示 在{c}后面即可添加任意单位内容. 一条记录含有多组数据的柱状图单位显示 标注单位的显示. 目前还未找到方法实现,当鼠标移动到标注上时设置显示单位. 标线单位的显示