• 数位DP


    不要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

    给你n到m的数,如果出现4还有连续62就是不吉利的号,要进行跳过。这个题暴力完全是可以过的,但他是数位DP的模板题,我可以直接统计每个区间的值,使用dp数组去0,用dp[i][j] 表示滴i个数时以j结尾所应该统计的个数

    #include <stdio.h>
    int dp[10][3];
    void inti()
    {
        int i;
        dp[0][0]=1;
        for(i=1;i<10;i++)
        {
            dp[i][0]=dp[i-1][0]*9-dp[i-1][1];
            dp[i][1]=dp[i-1][0];
            dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];
        }
    }
    int solve(int x)
    {
        int i,k,f,ans,t=x;
        int a[20]={0};
        k=0;
        while(x)
        {
            a[++k]=x%10;
            x/=10;
        }
        ans=f=0;
        for(i=k;i>0;i--)
        {
            ans+=a[i]*dp[i-1][2];
            if(f)
                ans+=a[i]*dp[i-1][0];
            else
            {
                if(a[i]>4)
                    ans+=dp[i-1][0];
                if(a[i]>6)
                    ans+=dp[i-1][1];
                if(a[i+1]==6&&a[i]>2)
                    ans+=dp[i][1];
            }
            if(a[i]==4||(a[i+1]==6&&a[i]==2))
                f=1;
        }
        return t-ans;
    }
    int main()
    {
        int a,b;
        inti();
        while(scanf("%d%d",&a,&b),a||b)
        {
            printf("%d
    ",solve(b+1)-solve(a));
        }
        return 0;
    }
  • 相关阅读:
    HTTP学习笔记(1)ULR语法
    wsdl地址如何在远程服务器上查看源码?
    java线程详解(三)
    java线程详解(二)
    java线程详解(一)
    java中this用法总结
    Linux运行python程序
    如何获取到Java对象的地址
    IDEA 远程调试
    linux环境中mysql默认端口3306无法连接问题排查
  • 原文地址:https://www.cnblogs.com/BobHuang/p/6924796.html
Copyright © 2020-2023  润新知