题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3555
Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 15372 Accepted Submission(s): 5563
Problem Description
The
counter-terrorists found a time bomb in the dust. But this time the
terrorists improve on the time bomb. The number sequence of the time
bomb counts from 1 to N. If the current number sequence includes the
sub-sequence "49", the power of the blast would add one point.
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
数位DP,之前做了一个相反的题目,结果WA了,后来发现数据不对,是long long 型数据。
#include <stdio.h> #include <string.h> int bit[25]; long long dp[25][2]; long long dfs(int len,bool is4,bool ismax) { if(len==0) return 1; ///搜索成功 if(!ismax&&dp[len][is4]>=0) return dp[len][is4]; long long cnt = 0; int maxnum = ismax? bit[len]:9; for(int i=0; i<=maxnum; i++) { if((is4&&i==9)) continue; cnt +=dfs(len-1,i==4,ismax&&i==maxnum); } return ismax?cnt:dp[len][is4]=cnt; } long long f(long long n) { int len = 0; while(n) { bit[++len] = n%10; n/=10; } return dfs(len,false,true); } int main() { int t; scanf("%d",&t); while(t--) { long long n; scanf("%lld",&n); memset(dp,-1,sizeof(dp)); printf("%lld\n",n-f(n)+1); } return 0; }