复习了一下数位dp
肯定不包含0,但是通常数位dp最后计算的结果较小的是包含前导0的,只是没显示出来而已,所以这题需要前导0,但是非前导0是不需要算进去的,因此,加个是否是前导0的状态即可
class Solution { public: int digits[10]; unordered_map<string,int> mp; vector<int> dp; int dfs(int p,bool e,bool zero){ if(p==-1) return 1; if(!e&&!zero&&dp[p]!=-1) return dp[p]; int u=e?digits[p]:9; int sum=0; for(int i=0;i<=u;i++){ if(!mp[string(1,i+'0')]){ continue; } if(i==0&&(!zero||(zero&&p==0))) continue; sum+=dfs(p-1,e&&i==u,zero&&i==0); } return e||zero?sum:dp[p]=sum; } int solve(int n){ int len=0; while(n){ digits[len++]=n%10; n/=10; } return dfs(len-1,1,1); } int atMostNGivenDigitSet(vector<string>& D, int N) { dp=vector<int>(10,-1); for(auto i : D) mp[i]=1; mp[string(1,'0')]=1; return solve(N); } };