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); } };
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步