hdu 2089 不要62

来源:互联网 发布:紫峰抢票软件下载 编辑:程序博客网 时间:2024/06/04 00:24
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。 
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。 
不吉利的数字为所有含有4或62的号码。例如: 
62315 73418 88914 
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。 
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。 
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。 
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。 
Sample Input
1 1000 0
Sample Output

80


思路:数位dp,dp[i][j],i表示第i位,j表示前一位是否是6

ac代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int num[10];int dp[10][2];int dfs(int len,int state,int limit){    if(len<0)    return 1;    if(!limit&&dp[len][state]!=-1)    return dp[len][state];    int fp=limit?num[len]:9;    int ret=0;    for(int i=0;i<=fp;i++)    {       if(i==4||(state&&i==2))       continue;       ret+=dfs(len-1,i==6,limit&&i==fp);    }    if(!limit)    dp[len][state]=ret;    return ret;}int get_num(int x){    int len=0;    while(x)    {        num[len++]=x%10;        x=x/10;    }    return dfs(len-1,0,1);}int main(){    int n,m;    memset(dp,-1,sizeof(dp));    while(cin>>n>>m&&(n+m))    {       int ans=get_num(m)-get_num(n-1);       cout<<ans<<endl;    }    return 0;}


原创粉丝点击