题解报告:hdu 2089 不要62

Problem Description

杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

Input

输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。

Output

对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

Sample Input

1 100
0 0

Sample Output

80
解题思路:模拟计数走一遍流程就清楚了,详解看代码。
AC代码一:
 #include<bits/stdc++.h>
using namespace std;
int n,m,dp[][],d[];
void init(){
memset(dp,,sizeof(dp));
dp[][]=;///特殊定义0位数首位是0的方案数为1
for(int i=;i<;++i){///表示i位数,最高位从1开始
for(int j=;j<;++j){///表示i位数的首位数字是j--->(0~9)
if(j==)continue;///如果当前首位为4,dp[i][j]=0
///累加i-1位数的首位是k的方案数,因为最高位已经确定,所以只需累加比其小的方案数即可
for(int k=;k<;++k){
if(j==&&k==)continue;///当前首位j与其右边这一位上的数字k不能组成62
dp[i][j]+=dp[i-][k];///状态转移方程
}
}
}
}
int solve(int x){///累加小于x的所有数的方案数,直到遇到4或者是62就退出累加
memset(d,,sizeof(d));///d数组记录x每一位上的数字
int len=,ans=;
while(x){///得到x的每一位数字
d[++len]=x%;
x/=;
}
///d[len+1]=0;///前面已经置0,避免产生上一次的结果6对这个统计的影响
for(int i=len;i>=;--i){///从高位向低位(从大到小)枚举位数i
for(int j=;j<d[i];++j){///巧妙处理:每当进入到下一位,就默认上一位确定
if(d[i+]==&&j==)continue;///跳过62,累加所有方案数
ans+=dp[i][j];///dp[i][4]都为0,所以这里无需判断j==4
}
///如果该位上是4或者(上一位是6并且当前位上是2)则直接退出后面的方案数的累加,因为后面的都不合法了
if(d[i]==||(d[i+]==&&d[i]==))break;
}
return ans;
}
int main(){
init();///预处理当前第i位首位是j符合条件的方案数
///for(int i=0;i<10;++i)cout<<dp[i][4]<<endl;
while(~scanf("%d%d",&n,&m)&&(n|m)){
printf("%d\n",solve(m+)-solve(n));
///差分思想,需要将[0,m+1)即[0,m]中的所有方案数减去[0,n)中的方案数才能得到[n,m]中满足条件的所有情况数
}
return ;
}

AC代码二:记忆化搜索。

 #include<bits/stdc++.h>
using namespace std;
int n,m,dp[][],d[];
///dp[pos][status]来保存在第pos位,status表示上一位是否为6这个状态
int dfs(int pos,bool if6,bool limit){///limit用来判断前一位是否为数位上界,是则本位不能取到大于a[pos]的数
if(!pos)return ;///特殊情况下为1,即dp[0][0]=1;
if(!limit&&dp[pos][if6]!=-)return dp[pos][if6];///若前一位不是上限,并且dp[pos][if6]已确定,直接return统计,这里体现了记忆化搜索
int up=limit?d[pos]:,ans=;///limit判断pos前的几位数字是否与n一样
for(int i=;i<=up;++i){
if(i==||(if6&&i==))continue;///这里is_6的值是0/1,用来区分前一位是否为6
///cout<<"当前第"<<pos<<"位,上限为"<<limit<<",前一个数是否为6:"<<if6<<",当前位为"<<i<<endl;
ans+=dfs(pos-1,i==6,limit&&i==up);
}
return limit?ans:(dp[pos][if6]=ans);///若前一位不是上限,即这一位可以达到最大,则更新dp值
}
int solve(int x){
memset(d,,sizeof(d));
int len=;
while(x){d[++len]=x%;x/=;}
return dfs(len,false,true);///刚开始前0位是相同的
}
int main(){
memset(dp,-,sizeof(dp));
while(~scanf("%d%d",&n,&m)&&(m|n)){
printf("%d\n",solve(m)-solve(n-));
}
return ;
}

数位dp知识点整理的更多相关文章

  1. 数位DP问题整理(一)

    第一题:Amount of degrees (ural 1057) 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1057 题意:[x,y ...

  2. 数位dp整理

    数位dp的思想就在于递归,记录当前的某一个唯一状态,依次递归下去,要注意唯一. 数位dp常设的状态有当前位置,上一数字,是否具有前导零,是否有限制. 1.CodeForces 55DBeautiful ...

  3. 数位dp整理 && 例题HDU - 2089 不要62 && 例题 HDU - 3555 Bomb

    数位dp: 数位dp是一种计数用的dp,一般就是要统计一个区间[li,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp.数位的含义:一个数有个位.十位.百位.千位......数 ...

  4. ACM个人零散知识点整理

    ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...

  5. 数位DP+其他

    参考资料: [1]:数位dp总结 之 从入门到模板 [2]:浅谈数位DP 题目一览表 来源 考察知识点 A 4352 "XHXJ's LIS" hdu 数位DP+状压DP+LIS ...

  6. 洛谷P2602 数字计数 [ZJOI2010] 数位dp

    正解:数位dp 解题报告: 传送门! 打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪 ...

  7. Kuangbin 带你飞 数位DP题解

    以前一直不知道该咋搞这个比较好. 感觉推起来那个数字好麻烦.后来有一种比较好的写法就是直接的DFS写法.相应的ismax表示当前位是否有限制. 数位DP也是有一种类似模版的东西,不过需要好好理解.与其 ...

  8. HYSBZ 1026: windy数(数位DP)

    类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.问[A,B]之间windy数的个数.(1 <= A <= B <= 2000000000 ) 思路 ...

  9. NOIP考前知识点整理

    前言:距离NOIP还有不到一百天(虽然NOIP没了),为了整理一下所学的内容,才有了这篇博文.本文内容无特殊说明全部来自于博主的博客,代码也都是新敲的,努力在个人的码风基础上做到尽量简洁,求资瓷. 一 ...

随机推荐

  1. 设计模式学习笔记——Prototype原型模式

    原型模型就是克隆. 还有深克隆.浅克隆,一切听上去都那么耳熟能详.

  2. SDUT OJ 1598 周游列国

    周游列国 Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描述 大家都知道孔子吧,春秋战国时候的一个老头儿.当时出国还不用护照,所以他经 ...

  3. set built-in function

    集合类型 集合对象是一组无序排列的可哈希的值,集合可以作为字典的键.因为集合是无序的,不可以为集合创建索引或执行切片操作,也没有键可以用来获取元素的值. 集合有两种不同的类型,可变集合和不可变集合.可 ...

  4. React引入,运行

    1.引入 <script src="https://cdn.bootcss.com/react/15.5.4/react.min.js"></script> ...

  5. 安装程序工具 (Installutil.exe)22

    网址:https://msdn.microsoft.com/zh-cn/library/50614e95(VS.80).aspx  安装程序工具 (Installutil.exe) .NET Fram ...

  6. Python里的一些注释规范

    写代码注释是一件很重要的事情,如果你写的一段函数给别人调用那么往往都需要配上一些基本的注释.写好代码可以让别人容易阅读你的代码.试想一 下:如果你在github上面找到一段你想要的代码,这段代码有20 ...

  7. ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml

    由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...

  8. Objective-C Runtime(一)预备知识

    很早就知道了Objective-C Runtime这个概念,「Objective-C奇技淫巧」「iOS黑魔法」各种看起来很屌的主题中总会有它的身影:但一直没有深入去学习,一来觉得目前在实际项目中还没有 ...

  9. [laravel]要点

    1. routing 2. Ioc 3. Facade 4. Artisan 1.routing 参考:http://laravel.com/docs/4.2/routing 了解routing之前先 ...

  10. 18-Angular 自定义模块以及配置路由模块懒加载

    新建项目,新建几个子模块,实现懒加载 用户.商品.文章 新建这三个模块 创建模块的时候后面加 --routing.会自动生成模块的路由文件 先删掉. 重新创建模块带routing 这样就会生成两个文件 ...