HDU 2089

总感觉有一些东西的对的   所以只要往前走就是了   哈哈哈哈哈哈哈哈哈哈哈

 

数位DP第一道  

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<iostream>
#include<math.h>

using namespace std;

#define inf 1000000000
#define MAXN  110

int f[15][16];

void init()
{
    f[0][0]=1;
    for(int i=1;i<=7;i++)
    {
        for(int j=0;j<10;j++)
        {
            for(int k=0;k<10;k++)
            {
                if(!(j==4||j==6&&k==2))
                    f[i][j]+=f[i-1][k];
            }
        }
    }
}
int call(int n)
{
    int cnt=0;
    while(n)
    {
        n=n/10;
        cnt++;
    }
    return cnt;
}
int dig[15];
void caldgt(int n,int len)
{
    memset(dig,0,sizeof(dig));
    for(int i=1;i<=len;i++)
    {
        dig[i]=n%10;
        n=n/10;
    }
}
int Ques(int n)
{
    int ans=0;
    int len=call(n);  //算长度
    caldgt(n,len);   //放到数组里面
    //printf("%d\n",len);
    for(int i=len;i>=1;i--)
    {
        for(int j=0;j<dig[i];j++)
        {
            if(!(j==4||j==2&&dig[i+1]==6))//合法就加
             {
                 ans+=f[i][j];
                // printf("%d\n",ans);
             }
        }
        if(dig[i]==4||dig[i]==2&&dig[i+1]==6)  //模拟一下 就知道了  
            break;
    }
    return ans;
}
int main()
{
    init();
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0)
            break;
        printf("%d\n",Ques(m+1)-Ques(n));  //处理出来 0  -  a  的  合法个数
    }
    return 0;
}

 

posted on 2017-02-27 20:19  HelloWorld!--By-MJY  阅读(159)  评论(0编辑  收藏  举报

导航