数位dp知识点整理
题解报告:hdu 2089 不要62
Problem Description
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
Input
Output
Sample Input
Sample Output
#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知识点整理的更多相关文章
- 数位DP问题整理(一)
第一题:Amount of degrees (ural 1057) 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1057 题意:[x,y ...
- 数位dp整理
数位dp的思想就在于递归,记录当前的某一个唯一状态,依次递归下去,要注意唯一. 数位dp常设的状态有当前位置,上一数字,是否具有前导零,是否有限制. 1.CodeForces 55DBeautiful ...
- 数位dp整理 && 例题HDU - 2089 不要62 && 例题 HDU - 3555 Bomb
数位dp: 数位dp是一种计数用的dp,一般就是要统计一个区间[li,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp.数位的含义:一个数有个位.十位.百位.千位......数 ...
- ACM个人零散知识点整理
ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...
- 数位DP+其他
参考资料: [1]:数位dp总结 之 从入门到模板 [2]:浅谈数位DP 题目一览表 来源 考察知识点 A 4352 "XHXJ's LIS" hdu 数位DP+状压DP+LIS ...
- 洛谷P2602 数字计数 [ZJOI2010] 数位dp
正解:数位dp 解题报告: 传送门! 打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪 ...
- Kuangbin 带你飞 数位DP题解
以前一直不知道该咋搞这个比较好. 感觉推起来那个数字好麻烦.后来有一种比较好的写法就是直接的DFS写法.相应的ismax表示当前位是否有限制. 数位DP也是有一种类似模版的东西,不过需要好好理解.与其 ...
- HYSBZ 1026: windy数(数位DP)
类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.问[A,B]之间windy数的个数.(1 <= A <= B <= 2000000000 ) 思路 ...
- NOIP考前知识点整理
前言:距离NOIP还有不到一百天(虽然NOIP没了),为了整理一下所学的内容,才有了这篇博文.本文内容无特殊说明全部来自于博主的博客,代码也都是新敲的,努力在个人的码风基础上做到尽量简洁,求资瓷. 一 ...
随机推荐
- Ajax_HTTP请求以及响应
什么是HTTP请求? 就是从用户的浏览器端向服务器端发送请求 一个HTTP请求一般由四个部分组成 1.HTTP请求的方法或者动作,比如GET或者POST请求 2.请求的URL,也就是请求的地址 3.请 ...
- delphi中的HOOK [转贴]
按事件分类,有如下的几种常用类型的钩子: 1)键盘钩子可以监视各种键盘消息. 2)鼠标钩子可以监视各种鼠标消息. 3)外壳钩子可以监视各种Shell事件消息. 4)日志钩子可以记录从系统消息队列中取出 ...
- 简说 call() 、apply() 、bind()
对于这三个方法,我想一部分人还是比较陌生的. 所以今天来个简单的介绍~ 我们可以将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数.call()和apply()的第一 ...
- javascript 阻止事件冒泡 cancelBubble
javascript简单的阻止事件冒泡,可以使用事件的cancelBubble方法为true: html部分 <button id="btn1">点击显示div< ...
- min-width 和 @media screen
min-width可以容器设置最小宽度,低于改宽度时,会自动加上滚动条,支持ie7及ie7+: @media only screen and (min-width: /*最小宽度(要加单位px)*/) ...
- UICollectionView基础用法
初始化部分: UICollectionViewFlowLayout *flowLayout= [[UICollectionViewFlowLayout alloc]init]; self.myColl ...
- CentOS 7.2 安装Gerrit 2.14.6
1.环境 本文使用VMWare虚拟机进行实验. 2核CPU,4GB内存,20GB硬盘,IP:192.168.159.131 CentOS 7.2最小安装(CentOS-7-x86_64-Minimal ...
- hihocoder 1015 KMP(找多个位置的 【*模板】)
#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- 目录操作(PHP)
1.创建目录(文件夹)mkdir("./test");2.删除目录(文件夹)只能删除空的文件夹rmdir("./test");3.移动目录(文件夹)rename ...
- 阮一峰 KMP BM算法
存一个链接,讲得好啊! 点击这里打开 字符串KMP 点击这里打开 字符串匹配的Boyer-Moore算法