Bomb HDU - 3555 數位dp
阿新 • • 發佈:2018-11-06
Code:
#include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<iostream> using namespace std; #define ll long long #define N 20 ll f[N][4], str; int arr[N],n; void get_table(){ f[0][0]=1; for(int i=1;i<N;++i){ f[i][0]=f[i-1][0]*10-f[i-1][1]; f[i][1]=f[i-1][0]; f[i][2]=f[i-1][2]*10+f[i-1][1]; } } ll solve(){ ll ans=0; bool flag=false; for(int i=n;i>=1;--i){ ans+=f[i-1][2]*arr[i]; if(flag) ans+=f[i-1][0]*arr[i]; if(arr[i]>4 && !flag) ans+=f[i-1][1]; if(arr[i+1]==4&&arr[i]==9) flag=true; } return ans; } int main(){ //freopen("input.in","r",stdin); get_table(); int T; scanf("%d",&T); while(T--){ scanf("%I64d",&str); memset(arr,0,sizeof(arr)); str++,n=0; while(str){ arr[++n]=str%10; str/=10; } printf("%I64d\n",solve()); } return 0; }