hdu3555Bomb(數位dp)
阿新 • • 發佈:2017-07-16
cin ans rom found amp int 數位dp case ems
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
The input terminates by end of file marker.
Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 18659 Accepted Submission(s):
6891
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
Input The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.
The input terminates by end of file marker.
Output For each test case, output an integer indicating the final points of the power.
Sample Input 3 1 50 500
Sample Output 0 1 15 Hint From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499", so the answer is 15.
Author [email protected]
Source 2010 ACM-ICPC Multi-University Training Contest(12)——Host by WHU 思路同hdu2089 http://www.cnblogs.com/L-Memory/p/7189656.html
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long f[20][20],dig[20]; long long ans,len,n,m,t; void init() { ans=0;len=0; memset(f,0,sizeof f); f[0][0]=1; for(long long i=1;i<=20;i++) for(long long j=0;j<10;j++) for(long long k=0;k<10;k++) if(!(j==4 && k==9)) f[i][j]+=f[i-1][k]; } long long solve(long long x) { while(x) { dig[++len]=x%10; x/=10; }dig[len+1]=0; for(long long i=len;i;i--) { for(long long j=0;j<dig[i];j++) if(!(dig[i+1]==4 && j==9)) ans+=f[i][j]; if(dig[i]==9 && dig[i+1]==4) break; }return ans; } int main() { cin>>t; while(t--) { cin>>n; init(); cout<<n+1-solve(n+1)<<endl; } return 0; }
hdu3555Bomb(數位dp)