• hdu 2089 不要62(入门数位dp)


    不要62

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 34510    Accepted Submission(s): 12484


    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
     
    Author
    qianneng
     
    Source
     
    Recommend
    lcy
     
    /*
    第一遍直接用搜索搞得,300多ms,第二次明白了dp数组的用处,只用了15ms
    dp数组的作用就是把每次搜到的状态都记录下来,等到再次搜到相同条件的时候,就不用继续递归下去了,直接调用答案,所以时间上会省时不少
    */
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #define N 100
    using namespace std;
    /*
    这个题我感觉没看懂给的数位DP用搜索就搞了,我下去再看看
    */
    int g[8];//一个数的每一位数,下标从1到len表示的是从个位到最高位
    int dp[N][N];//dp[i][j]表示当前剩余位数为i时当前位上有无6的状态为j是的状态;
    int dfs(int len,bool s,bool f)//剩下的位数,当前位置是不是6,选择数字的时候有没有限制,遍历的数字不能你要求的这个数还大
    {
        if(len<1)
            return 1;//找到一个终点了就输出一种解法
        if(!f&&dp[len][s]!=-1)
            return dp[len][s];
        int cur=0;
        int fmax=f?g[len]:9;//有限制只能选这一位上的数,没限制的话能选九位
        for(int i=0;i<=fmax;i++)
        {
            if(i==4||(s&&i==2)) continue;//不能有4,并且下两位不能是62
            cur+=dfs(len-1,i==6,f&&(i==fmax));
            //cout<<cur<<endl;
        }
        if(!f)
            dp[len][s]=cur;
        return cur;
    }
    int f(int x)
    {
        int len=1;
        while(x!=0)//将每一位数都存到数组中
        {
            g[len++]=x%10;
            x/=10;
        }
        memset(dp,-1,sizeof dp);
        //cout<<"len="<<len<<endl;
        return dfs(len-1,false,true);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF,(a||b))
            printf("%d
    ",f(b)-f(a-1));
        return 0;
    }
  • 相关阅读:
    第09组 Beta冲刺(2/5)
    第09组 Beta冲刺(3/5)
    第09组 Beta冲刺(4/5)
    第09组 Beta冲刺(5/5)
    第09组 Beta冲刺(1/5)
    SDN课程阅读作业(2)
    C语言I作业07
    C语言I博客作业05
    C语言I博客作业04
    C语言I博客作业03
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/5755359.html
Copyright © 2020-2023  润新知