数位dp裸题,好久没写数位dp了,回想了一下怎么写,当成个板子也行
#include<bits/stdc++.h>
using namespace std;
using LL =int64_t;
LL dp[20][3],cnt[20];
LL dfs(LL len,int pos,bool flag) {
if(len<0) {
if(pos==2) return 1;
return 0;
}
if(flag==false&&dp[len][pos]!=-1) return dp[len][pos];
int ends=(flag==true?cnt[len]:9);
LL ans=0;
for(int i=0;i<=ends;i++) {
if(pos==2||(pos==1&&i==9)) ans+=dfs(len-1,2,flag&&i==ends);
else if(i==4) ans+=dfs(len-1,1,flag&&i==ends);
else ans+=dfs(len-1,0,flag&&i==ends);
}
if(flag==false) dp[len][pos]=ans;
return ans;
}
LL solve(LL num) {
memset(cnt,0,sizeof(cnt));
int len=0;
while(num!=0) {
cnt[len++]=num%10;
num/=10;
}
return dfs(len-1,0,1);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
memset(dp,-1,sizeof(dp));
int T;cin>>T;
while(T--) {
LL x;cin>>x;
cout<<solve(x)<<"\n";
}
return 0;
}