dp总结篇
dp,直接递推和记忆化搜索
View Code
View Code
记忆化搜索
leetcode 1553 吃掉N个橘子的最少天数
思路:除2或除3总比减一划算,所以先减掉余数再除。由于N很大,需要记忆化搜索;由于N很大,不能用数组,可以用unordered_map

class Solution { public: // vector<int>dp; unordered_map<int, int>mp; int dfs(int n) { if(mp[n]) return mp[n]; int& ans = mp[n]; if(n == 0) return ans=-1; // 特殊,1需要1次,0最小需要-1次 return ans = min(dfs(n/3)+n%3, dfs(n/2)+n%2)+1; } int minDays(int n) { // dp.resize(n+1, -1); return dfs(n); } };
数位DP
leetcode 902 最大为N的数组组合
思路:数位dp,逐位考虑,同时记录前面的一些必要信息。pre记录是否已经小于,flag记录前面是否是全0. (细节挺多,每种情况都要考虑到,到最后发现很多情况能合并)

class Solution { public: typedef long long ll; ll qpow(ll a, ll b) { ll ret = 1; while(b) { if(b&1) ret *= a; b >>= 1; a *= a; } return ret; } ll dfs(vector<string>& digits, vector<int>& limits, int pos, bool pre, bool flag) { // // cout << "pos: " << pos << endl; int n = digits.size(), m = limits.size(); if(pos >= m) return !flag; int limit = limits[pos]; ll ret = 0; // 前面小 if(pre) { // 填0 if(flag) ret += dfs(digits, limits, pos+1, pre, flag); // 不填0 ret += qpow(n, m-pos); } else { // 前面等 int i = 0; for(;i < n;i++) if(stoi(digits[i]) >= limit) break; // 填limit if(i < n && stoi(digits[i]) == limit) ret += dfs(digits, limits, pos+1, pre, false); // 填0 if(flag) ret += dfs(digits, limits, pos+1, true, flag); // 填(0, limit) ret += i*qpow(n, m-pos-1); } return ret; } int atMostNGivenDigitSet(vector<string>& digits, int n) { int tmp = n; vector<int>limits; while(tmp) { limits.insert(limits.begin(), tmp%10); tmp /= 10; } // for(int num : limits) cout << num << " "; ll ans = dfs(digits, limits, 0, false, true); return ans; } };
个性签名:时间会解决一切
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-03-25 leetcode面试题16.24-在无序数组中所有发现和为sum的数对
2020-03-25 map底层为什么要用红黑树实现
2020-03-25 I/O复用
2020-03-25 五大IO模型
2019-03-25 Python-OpenCV中图像合并显示
2019-03-25 Python-OpenCV——Image Blurring(Image Smoothing)
2019-03-25 Python-OpenCV中的resize()函数