記憶化DFS的數位DP
阿新 • • 發佈:2018-12-10
還是熟悉的配方~~~
反恐專家
#include<bits/stdc++.h> #define ll long long using namespace std; ll dp[30][30],bit[30]; ll dfs(ll n,ll t,bool up) { ll hehe=0,upp; if(n==0) return 1; if(up==0&&dp[n][t]!=-1) return dp[n][t]; if(up==1) upp=bit[n]; else upp=9; for(int i=0;i<=upp;i++) { if(t!=4||i!=9) hehe+=dfs(n-1,i,up&&i==upp); } if(up==0) dp[n][t]=hehe; return hehe; } ll ans(ll m) { ll len; for(len=0;m>0;m/=10) bit[++len]=m%10; return dfs(len,0,true); } int main() { ll a,t; memset(dp,-1,sizeof(dp)); cin>>t; while(t--) { cin>>a; cout<<a-ans(a)+1<<endl; } }