zoukankan      html  css  js  c++  java
  • 不要62

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089

    不要62

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


    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
     
    题目大意:输入n,m,求区间n,m内没有4和64的数的个数
    个人思路:这是自己做过的第一道数位dp的题目,数位dp的学习:https://blog.csdn.net/wust_zzwh/article/details/52100392
    其实数位dp也是一种枚举,只是这里用到了记忆化的思想还有按这数的每一位来枚举,节省了很多时间,也很高效,注意的是优化,这一点要在做题目中总结。。。
    下面讲思路:如果外面在哪一位遇到了4,那么毫无疑问直接退出来,其次是遇到6和2的情况,因为必须是62连在一起才不要,所以外面要记录当前一位的前一位是否是6
    如果是6的话,当前一位是2的话直接continue掉。  还要注意的就是上界咯,比如259这个数,因为是从高位往低位枚举,当第一位枚举是1时,后面不管是哪位都不需要考虑范围了
    (因为根本无需担心会超出范围)如果是2的话,下面就有上限了,就是5······大概思路就是这样
    还有一点优化,因为每次虽然区间不同,但是那个数是不是有用的数是确定了,所以可以记录下来,不用每次都初始化dp
    看代码
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<string.h>
    #include<cmath>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    #include<map>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e6+10;
    const int maxk=100+10;
    const int maxx=1e4+10;
    const ll maxa=43200;
    #define INF 0x3f3f3f3f3f3f
    int dp[10][2];//dp[pos][sta]代表第几位,前面是否有6
    int a[10];
    int dfs(int pol,int pre,int sta,int limit)//pol指的是当前的数位,pre是前一个的数位的值,sta是用来标记是否前一位是6,limit判断是否有上限
    {
        if(pol==-1)
            return 1;
        if(!limit&&dp[pol][sta]!=-1)
            return dp[pol][sta];
        int ans=0;
        int up=limit?a[pol]:9;
        for(int i=0;i<=up;i++)
        {
            if(i==4)
                continue;
            if(sta&&i==2)
                continue ;//这里都是不能执行下去的情况
            ans+=dfs(pol-1,i,i==6,limit&&i==a[pol]);
        }
        if(!limit) dp[pol][sta]=ans;//没有限制情况下可以记录答案
        return ans;
    }
    int solve(int n)
    {
        int p=0;
        while(n)
        {
            a[p++]=n%10;
            n/=10;
        }
        return dfs(p-1,-1,0,1);
    }
    int main()
    {
        int n,m;
        memset(dp,-1,sizeof(dp));
        while(cin>>n>>m)
        {
            if(n==0&&m==0)
                break;
            cout<<solve(m)-solve(n-1)<<endl;
        }
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    HUST 1372 marshmallow
    HUST 1371 Emergency relief
    CodeForces 629D Babaei and Birthday Cake
    CodeForces 629C Famil Door and Brackets
    ZOJ 3872 Beauty of Array
    ZOJ 3870 Team Formation
    HDU 5631 Rikka with Graph
    HDU 5630 Rikka with Chess
    CodeForces 626D Jerry's Protest
    【POJ 1964】 City Game
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9361980.html
Copyright © 2011-2022 走看看