数位DP HDU 3555

 
  
#include 
#include 
#include 
#include 
#define MAX 1000005
using namespace std;
int max(int a,int b)
{
    if(a>b)
        return a;
    else return b;
}
int main()
{
    int n,m;
    long long dp[20][3];
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int i=1;i<=20;i++)
    {
        dp[i][0]=dp[i-1][0]*10-dp[i-1][1];// xxxx - 49xx
        dp[i][1]=dp[i-1][0];//9xxx 
        dp[i][2]=dp[i-1][2]*10+dp[i-1][1];// x49x  49xx   有49 
    }
    
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int num[20];
        long long a;int len=1;
        scanf("%lld",&a);
        a++;
        memset(num,0,sizeof(num));
        while(a)
        {
            num[len++]=a%10;
            a/=10;
        }
        
        int flag=0;int last=0;long long sum=0; 
        
        for(int i=len;i>=1;i--)
        {
            sum+=dp[i-1][2]*num[i];//加上
            if(flag)// 开头是49 后面的全是 
            {
                sum+=dp[i-1][0]*num[i];//49xx
            } 
            if(!flag && num[i]>4)//开头不是 49 开头大于4 那么就一定包含 49 
            {
                sum+=dp[i-1][1];//52xx
            } 
            if(last==4 && num[i]==9)//为了49xx 
            {
                flag=1;
            }
            last=num[i];
        }
        printf("%lld\n",sum);
    }
    
    return 0;
}


你可能感兴趣的:(动态规划)