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,dp[i][j][k],i表示第i位,j表示前一位的数,k表示前边是否出现过49
ac代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int num[20]; long long dp[20][10][2]; long long dfs(int len,int pre,int state,int limit) { if(len<0) return state; if(!limit&&dp[len][pre][state]!=-1) return dp[len][pre][state]; int fp=limit?num[len]:9; long long ret=0; for(int i=0;i<=fp;i++) ret+=dfs(len-1,i,state||(pre==4&&i==9),limit&&i==fp); if(!limit) dp[len][pre][state]=ret; return ret; } long long get_num(long long x) { int len=0; while(x) { num[len++]=x%10; x=x/10; } return dfs(len-1,0,0,1); } int main() { long long n,m; memset(dp,-1,sizeof(dp)); int t; cin>>t; while(t--) { cin>>n; long long ans=get_num(n); cout<<ans<<endl; } return 0; }