zoukankan      html  css  js  c++  java
  • 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);
            
        }
    };
  • 相关阅读:
    Python 函数装饰器简明教程
    *arg和**kwarg的区别
    克里金插值
    C语言Hello world
    ibatis错误
    typealias
    视图
    权限分级设置
    走出浮躁的泥沼:学会享受学习过程的乐趣
    R语言 eval(quote(x)) 和 eval(x)
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/9727425.html
Copyright © 2011-2022 走看看