1. 程式人生 > >記憶化DFS的數位DP

記憶化DFS的數位DP

還是熟悉的配方~~~

                                                                       反恐專家

#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;
	}
}