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?
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.
3 1 50 500
0
1
15
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.
数位dp的板题。求一段区间内含有49的数有多少。
源代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
#include <cmath>
long long dp[30][3],n;
int a[30];
long long DFS(int pos,int status,bool limit){
if (pos <= 0)
return status == 2;
if (!limit && dp[pos][status] != -1)
return dp[pos][status];
int up = limit?a[pos]:9;
long long ans = 0;
for (int i = 0; i <= up; i++){
int statuss = status;
if (status == 0 && i == 4)
statuss = 1;
if (status == 1 && i != 4 && i != 9)
statuss = 0;
if (status == 1 && i == 9)
statuss = 2;
ans += DFS(pos - 1,statuss,limit&&i==up);
}
if (!limit){
dp[pos][status] = ans;
}
return ans;
}
long long solve(long long n1){
int length = 0;
while (n1){
a[++length] = n1 % 10;
n1 /= 10;
}
return DFS(length,0,1);
}
int main(){
int T;
while(scanf("%d",&T)!=EOF){
while (T--){
memset(dp,-1,sizeof(dp));
memset(a,0,sizeof(a));
scanf("%lld",&n);
printf("%lld\n",solve(n));
}
}
return 0;
}
这个题就是错了几法就是数据类型错了。很伤……