HDU 2089 不要62

原创 2018年04月16日 20:05:42

题目描述

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

分析

数位dp入门题,dp过程中当记录上一位的值,如果上一位为6那么这一位不能位2,题目还规定这一位不能为4,所以无论什么情况这一位不能为4。
我们设状态为f[i][j],i为当前位数,即从当前位出发,在“正常情况”下所拥有的方案数,j为判断上一位是否为6,因为上一位是否为6的两个结果是不同的。
具体看代码,数位dp,看看代码就可以理解。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=20;
int f[MAXN][2],a[MAXN],N,M;
int dfs(int pos,int pre,int s,bool limit){
//pos当前位数,pre记录上一位,s为状态上一位是否为6
//limit实现不同位数的方案数,当limit为1时,即规定下次搜索是将下一位当成首位
    if(pos==-1) return 1;//边界条件
    if(!limit&f[pos][s]!=-1) return f[pos][s];//记忆化,已经算过的就不用再往下算了
    int sum=0,up=limit? a[pos]:9;//up为上限,当该位为首位时,枚举的最高位要与输入数据保持一致
    for(int i=0;i<=up;i++){
        if(pre=6&&i==2) continue;//上一位为6并且这一位为是跳过 
        if(i==4) continue;
        //同理,这一位为4时跳过 
        sum+=dfs(pos-1,i,i==6,limit&&i==a[pos]);
        //i==a[pos]可以将该位作为首位 
    } 
    if(!limit) f[pos][s]=sum;//只有limit=0时是"正常情况",才可以记录 
    return sum;
}
int solve(int x){
    int pos=0;
    while(x){
        a[pos++]=x%10;
        x/=10;
    }//分离各个位 
    return dfs(pos-1,-1,0,true);
}
int main(){
    while(scanf("%d%d",&N,&M)==2){
        if(N+M==0) return 0;
        memset(f,-1,sizeof(f));
        printf("%d\n",solve(M)-solve(N-1));
    }
}

【孙伟老师】从入门到精通的AI(Adobe Illustrator)软件实用标准视频课程

-
  • 1970年01月01日 08:00

HDU 2089 不要62(数位DP,三种姿势)

HDU 2089 不要62(数位DP,三种姿势) ACM 题目地址:HDU 2089 题意:  中文题意,不解释。 分析: 100w的数据,暴力打表能过先初始化dp数组...
  • hcbbt
  • hcbbt
  • 2014-07-26 16:00:55
  • 7630

HDU 2089 不要62(数位dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089题解:开一个dp数组,设i代表当前数字的长度,dp[i][0]表示不含4和62的数字, dp[i]...
  • Infinity_Izayoi
  • Infinity_Izayoi
  • 2016-07-20 21:50:37
  • 289

HDU2089 不要62(数位DP入门经典题目)

昨天做了一道很奇怪的数字题,不知道怎么做,今天才知道是数位DP ……我来学习学习。 传送门 大意:给定区间[n,m][n,m],求在n到m中没有“62“或“4“的数的个数。如62315包含62,8...
  • geng4512
  • geng4512
  • 2015-08-24 20:48:09
  • 1593

HDU 2089 不要62(数位dp&记忆化搜索)

题目链接:[kuangbin带你飞]专题十五 数位DP C - 不要62题意 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好...
  • to_be_better
  • to_be_better
  • 2016-02-14 00:04:25
  • 1577

hdu2089 不要62(数位dp入门)

hdu2089分析算是第一次做数位dp吧,算是长见识了吧,思路相当于是把例如3421拆成3000+400+20+1的情况,对于3000,已经预处理了0-2999的结果,直接加上,3符合要求,所以看40...
  • pibaixinghei
  • pibaixinghei
  • 2016-02-02 13:12:29
  • 262

【杭电】2089 不要62【打表】

http://acm.split.hdu.edu.cn/showproblem.php?pid=2089 #include #include int luck(int x) { ...
  • Alternative_19
  • Alternative_19
  • 2016-10-27 17:49:05
  • 686

【数位DP】 hdu2089 不要62

不要62 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:问在n,m之间不含4和62序列(4和62为不吉利数)的数字有多少个。 题解:把...
  • ACM_Ted
  • ACM_Ted
  • 2012-08-22 15:13:57
  • 4050

HDU-2089-不要62(数位DP)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[L,R]间数字中不含4和62的个数 题解:数位DP CODE: #incl...
  • qq978874169
  • qq978874169
  • 2016-08-04 10:54:24
  • 109

HDU2089 不要62(数位DP)

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来...
  • xiaoqitu7
  • xiaoqitu7
  • 2016-01-26 18:10:04
  • 201
收藏助手
不良信息举报
您举报文章:HDU 2089 不要62
举报原因:
原因补充:

(最多只允许输入30个字)