HDU 3555 Bomb
本题求一个数包含49的个数,典型数位DP问题。
状态表示:\(f[len][state]\):当前为第len位,当前已统计的数字的状态为state。
其中,state有\(0,1,2\)三种值:
- state == 1,表示上一位为4
- state == 2,表示高位已存在49
- state == 0,其他情况
LL f[20][3];
int a[20];
LL n;
LL dfs(int len,int state,bool limit)
{
if(!len) return state==2;
if(!limit && ~f[len][state]) return f[len][state];
int num=limit?a[len-1]:9;
LL res=0;
for(int i=0;i<=num;i++)
{
if(state == 2 || (state == 1 && i == 9))
res+=dfs(len-1,2,limit&&i==num);
else
res+=dfs(len-1,i==4,limit&&i==num);
}
if(!limit) f[len][state]=res;
return res;
}
LL dp(LL n)
{
int len=0;
while(n)
{
a[len++]=n%10;
n/=10;
}
return dfs(len,0,1);
}
int main()
{
memset(f,-1,sizeof f);
int T;
cin>>T;
while(T--)
{
cin>>n;
cout<<dp(n)<<endl;
}
//system("pause");
return 0;
}