leetcode 902 数位dp 不包含0

复习了一下数位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);
        
    }
};

猜你喜欢

转载自www.cnblogs.com/cnblogs321114287/p/9727425.html