hdu3555经典的数位dp

来源:互联网 发布:sql求每门课程平均分 编辑:程序博客网 时间:2024/06/05 01:51
经典不解释
#include<stdio.h>#include<climits>#include<algorithm>#include<stack>#include<iostream>#include<cmath>#include<set>#include<vector>#include<map>#include<queue>#include<string.h>using namespace std;__int64 n;__int64 f[30][12]; int digit[30];int t;void init(){  memset(f,0,sizeof(f));  f[0][0]=1;  for(int i=1;i<30;i++)  {     for(int j=0;j<=9;j++)     {    for(int k=0;k<=9;k++)    {      if(!(j==4&&k==9))        f[i][j]=f[i-1][k]+f[i][j];    }      }  }  //cout<<f[2][4]<<endl;}__int64 find(__int64 x){ memset(digit,0,sizeof(digit)); __int64 ans=0; int cnt=0; while(x>0) {      digit[++cnt]=x%10;      x/=10;    }    digit[cnt+1]=0;    for(int i=cnt;i>=1;i--)    {       for(int j=0;j<digit[i];j++)       {      if(!(digit[i+1]==4&&j==9))         ans+=f[i][j];       }       if(digit[i]==9&&digit[i+1]==4) break;    }    return ans;}int  main(void){     cin>>t;     while(t--)     {     scanf("%I64d",&n); init(); printf("%I64d\n",n+1-find(n+1));//由于不算0,因此要减去1  //find(n+1);        }  return 0;}

0 1
原创粉丝点击