hdu 3555

数位DP,各种理解难题

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define LL long long
using namespace std;
unsigned long long n;
LL f1[25],f2[25],f3[25];
int s[25];
int t;
int main()
{
    cin>>t;
    int i,j,k;
   f1[0]=0;f2[0]=1;f3[0]=0;
    for(i=1;i<=19;i++)
    {
        f1[i]=f1[i-1]*10+f3[i-1];
        f2[i]=10*f2[i-1]-f3[i-1];
        f3[i]=f2[i-1];
    }
    while(t--)
    {
        scanf("%I64d",&n);
        n++;//因为判断n时只判断了n-1,比如492只判断了491就结束了,但492也是一种情况
        LL sum=0;
        i=0;
        while(n)
        {
            s[i++]=n%10;
            n/=10;
        }
        int len=i;
        int num,pre=-1;
        int flag=0;
        for(i=len-1;i>=0;i--)
        {
            num=s[i];
            j=i+1;
            for(k=0;k<num;k++)
            {
                sum+=f1[j-1];
                if(flag) sum+=f2[j-1];
                if(!flag&&k==4) sum+=f3[j-1];//此处还要加上!flag的条件,如果flag==1那么此种情况在上一行就已经算进去了
            }
            if(num==9&&pre==4) flag=1;
            pre=num;
        }
        printf("%I64d\n",sum);
    }
    return 0;
}


posted @ 2013-04-08 13:54  LJ_COME!!!!!  阅读(106)  评论(0编辑  收藏  举报