hdu3555(数位dp)

来源:互联网 发布:ios leancloud数据库 编辑:程序博客网 时间:2024/06/05 09:07

链接:点击打开链接

题意:求1~N中含49的数的个数(4和9必须相邻)

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;long long dp[50][10],dight[50];long long solve(long long x){    long long i,j,len,ans,temp;    temp=x;    memset(dight,0,sizeof(dight));    len=1;ans=0;    while(x){        dight[len++]=x%10;        x/=10;    }    for(i=len;i>=1;i--){    for(j=0;j<dight[i];j++){        if(!(dight[i+1]==4&&j==9))        ans+=dp[i][j];    }    if(dight[i+1]==4&&dight[i]==9)    break;    }    return temp-ans;                    //返回值改成含49的个数}int main(){                             //数位dp 具体看http://blog.csdn.net/stay_accept/article/details/48749621    long long t,n,i,j,k;                //这题求的是含49的个数    memset(dp,0,sizeof(dp));    dp[0][0]=1;    for(i=1;i<=25;i++)                  //数据量变大了因此要预处理更多数据    for(j=0;j<=9;j++)    for(k=0;k<=9;k++){        if(!(j==4&&k==9))        dp[i][j]+=dp[i-1][k];    }    scanf("%lld",&t);    while(t--){        scanf("%lld",&n);        printf("%lld\n",solve(n+1)-solve(1));    }    return 0;}

1 0