Description
Input
Output
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.
判断是否子串是否含有49
按位dp即可 需要判断前面位数的3种状态
ACcode
#include<iostream> #include<cstring> #include<cstdio> #define ll long long using namespace std; ll dp[25][3];///第二个参数表示 2-》》含有49、1--》》 不含有49但前位是4 0--》》其他 int date[25]; ll dfs(int pos,int flag,bool limit){ if(!pos)return flag==2; if(!limit&&dp[pos][flag]!=-1) return dp[pos][flag]; ll ans=0; int ed=limit?date[pos]:9; for(int i=0;i<=ed;++i){ int tmp=flag; if(flag==1&&i==9) tmp=2; else if(flag==0&&i==4) tmp=1; else if(flag==1&&i!=4&&i!=9) tmp=0; ans+=dfs(pos-1,tmp,limit&&i==ed); } return limit?ans:dp[pos][flag]=ans; } void doit(){ ll n; scanf("%I64d",&n); int len=0; while(n){ date[++len]=n%10; n/=10; } printf("%I64d\n",dfs(len,0,1)); } int main(){ int loop; memset(dp,-1,sizeof(dp)); scanf("%d",&loop); while(loop--)doit(); return 0; }