zoukankan      html  css  js  c++  java
  • HDU2089 数位DP

    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
     

    初学数位DP,看了ppt后打的,需要注意的是m要++,因为区间要小一位。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define il inline
    #define db double
    using namespace std;
    il int gi()
    {
        int x=0,y=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
            y=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return x*y;
    }
    int f[10][10],i,j,k;
    int d1[10],d2[10];
    int main()
    {
        f[0][0]=1;
        for(i=1;i<=9;i++)
            for(j=0;j<=9;j++)
                for(k=0;k<=9;k++)
                    if(j!=4&&!(j==6&&k==2))
                        f[i][j]+=f[i-1][k];
        int n,m;
        while(n=gi(),m=gi())
        {
            if(!n&&!m)
            return 0;
            m++;
            memset(d1,0,sizeof(d1));
            memset(d2,0,sizeof(d2));
            int len1=0,len2=0;
            while(n!=0)
            {
                d1[++len1]=n%10;
                n/=10;
            }
            while(m!=0)
            {
                d2[++len2]=m%10;
                m/=10;
            }
            int sum1=0,sum2=0;
            for(i=len1;i>=1;i--)
            {
                for(j=0;j<d1[i];j++)
                    if(j!=4&&!(j==2&&d1[i+1]==6))
                    sum1+=f[i][j];
                if(d1[i]==4||(d1[i]==2&&d1[i+1]==6))
                break;
            }
            for(i=len2;i>=1;i--)
            {
                for(j=0;j<d2[i];j++)
                    if(j!=4&&!(j==2&&d2[i+1]==6))
                    sum2+=f[i][j];
                if(d2[i]==4||(d2[i]==2&&d2[i+1]==6))
                break;
            }
            printf("%d
    ",sum2-sum1);
        }
        return 0;
    }
    PEACE
  • 相关阅读:
    [YTU]_2917(Shape系列-3)
    c3p0-0.9.2.1.bin用于jdbc链接池
    C#加密解密DES字符串<转>
    Bechmarksql
    PHP中foreach有关引用的问题
    jqgrid 原理2
    jqggrid原理2
    jqgrid1原理
    JQgrid 入门
    搞开发真的是 坑太多了,
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/7420058.html
Copyright © 2011-2022 走看看