zoukankan      html  css  js  c++  java
  • C

    C - 不要62

    杭州人称那些傻乎乎粘嗒嗒的人为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
    

    这是我第一个数位dp入门题,首先用自己动归的代码打出来了,虽然谁说代码贼丑,但是还是完美地解决这个问题,而且时间复杂度可观,接下来看别人的这道题的代码,可以说dfs深搜加记忆化的代码是真的简洁(当然还是动归的思想)

    这是我学完之后的代码

    #include<cstdio>
    #include<algorithm>
    #define mset(a,b)   memset(a,b,sizeof(a))
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    const int maxn=1e5+10;
    const int branch=26;
    const int inf=0x3f;
    const int MOD=1e5+7;
    int n,m;
    ll dp[20][2];//dp[k][0/1]k位,前位有无限制6的符合条件的种类数
    int num[20];
    ll dfs(int pos,bool limit,bool istop)//前面是否限制位6,是否到顶端
    {
        /*如果没有到顶端即前一位没有到最大num[pos+1],那么这个过程就相当在求dp[pos][limit]
          否则就会枚举0~num[pos],dp求所有值,
          注释:limit=1则表示前一位为6,istop=1表示前一位已经到顶端
        */
        if(!pos)
            return 1;
        if(!istop&&dp[pos][limit]!=-1)
            return dp[pos][limit];
        ll res=0ll;
        int rmax=istop?num[pos]:9;
        for(int i=0;i<=rmax;++i)
        {
            if(i==4||(limit&&i==2))
                continue;
            res+=dfs(pos-1,i==6,istop&&i==rmax);
        }
        if(!istop)
            dp[pos][limit]=res;
        return res;
    }
    ll solve(ll val)
    {
        if(val==0)
            return 1;
        int pos=0;
        while(val)//分解数位,位置从1~pos
        {
            num[++pos]=val%10;
            val/=10;
        }
        return dfs(pos,0,1);
    }
    int main()
    {
        mset(dp,-1);
        ll a,b;
        while(~scanf("%lld %lld",&a,&b))
        {
            if(a==0&&b==0)
                break;
            printf("%lld
    ",solve(b)-solve(a-1));
        }
        return 0;
    }
    
  • 相关阅读:
    Java匹马行天下之一顿操作猛如虎,框架作用知多少?
    ztree树应用
    动态将ASPX生成HTML网页并将网页导出PDF
    实现图片向上不停的无限滚动效果简单代码
    简单的前端正则验证用户输入的数字是否合法
    eclipse出现jdk版本更新导致无法启动
    删除所有视图 删除所有存储过程
    删除所有表的数据
    要求必须全部重复的数据sql--想了半天才写出来的
    查询树节点下的所有子节点包括根节点
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/10427263.html
Copyright © 2011-2022 走看看