
动态规划
各种 dp 分类汇总
algsup
这个作者很懒,什么都没留下…
展开
-
[线性dp]leetcode32:最长的有效括号(hard)
【代码】[线性dp]leetcode32:最长的有效括号(hard)原创 2019-12-04 17:07:14 · 200 阅读 · 0 评论 -
[线性 DP][中心扩展法]leetcode647:回文子串(medium)
回文串的子题,可以运用相同的方法解题。原创 2019-12-04 11:13:31 · 294 阅读 · 0 评论 -
[记忆化dfs]leetcode2400:恰好移动 k 步到达某一位置的方法数目(medium)
思路:记忆化 dfs。原创 2022-09-17 14:05:06 · 362 阅读 · 0 评论 -
[记忆化dfs]leetcode1575:统计所有可行路径(hard)
思路:记忆化 dfs。原创 2022-09-16 08:52:46 · 358 阅读 · 0 评论 -
[贪心+记忆化dfs]leetcode1553:吃掉 N 个橘子的最少天数(hard)
思路:贪心 + 记忆化 dfs。原创 2022-09-15 11:29:45 · 292 阅读 · 0 评论 -
[记忆化 dfs]leetcode464:我能赢吗(medium)
思路:记忆化 dfs。原创 2022-09-15 09:44:52 · 246 阅读 · 0 评论 -
[记忆化dfs][排序]leetcode1387:将整数按权重排序(medium)
思路:记忆化 dfs + 排序。原创 2022-09-14 07:58:47 · 294 阅读 · 0 评论 -
[记忆化dfs]leetcode894:所有可能的真二叉树(medium)
思路:记忆化 dfs。原创 2022-09-13 21:37:16 · 191 阅读 · 0 评论 -
[记忆化dfs]leetcode638:大礼包(medium)
难点在于如何设计状态:将购物清单 needs 看作是一个状态,然后遍历礼品列表,每选择一个满足条件的礼品 i,将购物清单 needs 进行更新,即除去礼品 i 中所有物品之后的新购物清单 nxt_needs 作为新状态,然后继续使用 dfs 来计算这个新状态 nxt_needs 的最低价格。思路:记忆化 dfs。原创 2022-09-13 20:06:48 · 263 阅读 · 0 评论 -
[线性 DP]leetcode6137:检查数组是否存在有效划分(medium)
二字,然后就是定义 DP 状态了,至于状态转移方程,由三种划分方式,取决于 a[i] a[i-1] a[i-2] 这三个元素之间的关系。tips:划分 -> 子问题 -> DP。如何想到 DP 呢?原创 2022-08-08 09:25:30 · 146 阅读 · 0 评论 -
[字符串 DP][线性 DP]leetcode6138:最长理想子序列(medium)
tips:对于字符串问题套路,使用。子序列 + 相邻:DP 关键字。原创 2022-08-08 09:09:02 · 161 阅读 · 0 评论 -
[线性dp][接雨水]leetcode821:字符的最短距离(easy)
思路类比接雨水,两次遍历求解最佳答案。原创 2022-04-19 15:48:04 · 767 阅读 · 0 评论 -
[LIS]leetcode1218:最长定差子序列(medium)
代码】[LIS]leetcode1218最长定差子序列(medium)原创 2022-07-24 08:08:10 · 280 阅读 · 0 评论 -
[LIS]leetcode1048:最长字符串链(medium)
思路最长上升子序列模型。原创 2022-07-23 22:32:02 · 317 阅读 · 0 评论 -
[树形dp]leetcode814:二叉树剪枝(medium)
代码】[树形dp]leetcode814二叉树剪枝(medium)原创 2022-07-21 17:16:47 · 259 阅读 · 0 评论 -
[线性dp]leetcode1235:规划兼职工作(hard)
代码】[线性dp]leetcode1235规划兼职工作(hard)原创 2022-07-17 15:14:44 · 217 阅读 · 0 评论 -
[线性dp]leetcode2008:出租车的最大盈利(medium)
代码】[线性dp]leetcode2008.出租车的最大盈利(medium)原创 2022-07-17 09:36:54 · 349 阅读 · 0 评论 -
[线性dp]leetcode2304:网格中的最小路径代价(medium)
题目:题解:代码如下:原创 2022-07-10 10:23:14 · 281 阅读 · 0 评论 -
[线性dp]leetcode873:最长的斐波那契子序列的长度(medium)
题目:题解:代码如下:原创 2022-07-09 17:06:24 · 161 阅读 · 0 评论 -
[线性dp]leetcode152:乘积最大子数组(medium)
题目:题解:代码如下:原创 2022-07-08 09:25:21 · 143 阅读 · 0 评论 -
[线性dp]leetcode53:最大子数组和(easy)
题目:题解:代码如下:原创 2019-10-09 20:36:52 · 333 阅读 · 0 评论 -
[线性dp]leetcode2320:统计放置房子的方式数(medium)
题目:题解:代码如下:原创 2022-07-05 20:15:09 · 322 阅读 · 0 评论 -
[线性dp]leetcode213:打家劫舍 II(medium)
题目:题解:代码如下:原创 2022-07-05 19:14:19 · 165 阅读 · 0 评论 -
[线性dp]leetcode198:打家劫舍(medium)
题目:题解:代码如下:原创 2022-07-05 17:24:23 · 318 阅读 · 0 评论 -
[dp][记忆化dfs]leetcode2328:网格图中递增路径的数目(hard)
题目:题解:代码如下:原创 2022-07-05 15:34:29 · 199 阅读 · 0 评论 -
[dp][记忆化dfs]leetcode329:矩阵中的最长递增路径(hard)
题目:题解:代码如下:原创 2022-07-05 15:28:40 · 150 阅读 · 0 评论 -
[01背包]leetcode115:不同的子序列(hard)
题目:题解:代码如下:原创 2022-06-07 16:46:16 · 147 阅读 · 0 评论 -
[完全背包]leetcode2240:买钢笔和铅笔的方案数(medium)
题目:题解:代码如下:using LL = long long;class Solution {public: long long waysToBuyPensPencils(int n, int c1, int c2) { return dp2(n,c1,c2); } LL dp2(int n,int c1,int c2) { vector<LL> f(n+1,1); for(int v:{c1,原创 2022-05-28 08:21:39 · 192 阅读 · 0 评论 -
[线性dp]leetcode2266:统计打字方案数(medium)
题目:题解:思路:线性 DP状态表示f[i]–集合:长度为 i 的只有一种数字字符的字符串对应的字母字符串的集合;属性为数量。状态计算–划分依据:把末尾的1个、2个、3个连续数字字符转换为一个字母,那么 f[i] 就由 f[i-1] f[i-2] f[i-3] 进行转移出来了。代码如下:const int mod =1e9+7,N = 1e5+10;// 数字字符不为7和9的f[i]:表示长度为i的只有一种数字字符的字符串对应的字母字符串的数量// 数字字符为7和9的g[i]原创 2022-05-21 14:38:54 · 198 阅读 · 0 评论 -
[树形dp]leetcode337:打家劫舍 III(medium)
题目:题解:与 AcWing 285. 没有上司的舞会 一样,使用树形 dp 即可。代码如下:class Solution {public: // 原题:没有上司的舞会 int rob(TreeNode* root) { auto res=dfs(root); return max(res[0],res[1]); } // v[0]表示不选当前节点的金额最大值,v[1]表示选择当前节点的金额最大值 vector<原创 2022-05-20 19:05:27 · 165 阅读 · 0 评论 -
[树形dp]leetcode543:二叉树的直径(easy)
题目:题解:思路:根节点左子树的最大深度+根节点右子树的最大深度=直径。代码如下:class Solution {public: int res=0; //思路:左子树的最大深度+右子树的最大深度为二叉树的直径 //这个递归可以想象成记忆化dfs或者说分治法,只有当最小子问题解决时(达到叶子节点时,深度为1),总问题才能得到解决(左子树的深度+右子树的深...原创 2020-01-09 23:22:42 · 318 阅读 · 0 评论 -
[树形dp]leetcode2265:统计值等于子树平均值的节点数(medium)
题目:题解:使用自下而上的 DFS 就行了,也就是所谓的树形 DP。代码如下:using PII = pair<int,int>;#define x first#define y secondclass Solution {public: // 采用自底向上的递归,利用当前节点的左右子树的返回值,来计算当前节点计算的平均值是否符合题意 int res=0; int averageOfSubtree(TreeNode* root) {原创 2022-05-20 15:58:47 · 180 阅读 · 0 评论 -
[01背包]leetcode474:一和零(medium)
题目:题解:本题只不过是在一个物品里面限定了2个体积,所以我们仅需维护两个背包体积即可,剩下的思路等同朴素版 01 背包。代码如下:int f[610][110][110];int f2[110][110];class Solution {public: // 两个维度的01背包,限制0的个数最多为m个,限制1的个数最多为n个 int findMaxForm(vector<string>& v, int m, int n) { re原创 2022-05-17 13:10:36 · 136 阅读 · 0 评论 -
[01背包][dfs]leetcode494:目标和(medium)
题目:解题思路:1)利用动态规划解题:1.每个元素可看作一个物品,+1表示将此物品取出,-1表示将此物品放回2.sum表示将所有物品全部取出,sum+S表示有些物品取出两次,有些物品取出后又放回,这样就是表示+1的有两次,除以2就是+1的取出一次。3.本题本质和01背包一样的,利用动态规划解题2)使用DFS穷举所有可能的情况,暴搜+剪枝代码如下:class Solution ...原创 2019-08-10 09:29:38 · 347 阅读 · 0 评论 -
[01背包]leetcode416:分割等和子集(medium)
题目:题解:本题的难点在于如何将问题转换为01背包:题目要求我们将数组元素分成两个总和相等的子集,也就是我们需要从数组中选出若干个元素(每个元素只能选一次),使得元素之和等于所有元素的一半,显然使用 01 背包的模型做了。代码如下:class Solution {public: // 思路:转换为01背包,每件物品只能选一次,求是否能恰好装满sum/2 bool canPartition(vector<int>& v) { ret原创 2022-05-15 09:29:20 · 164 阅读 · 0 评论 -
[完全背包]leetcode139:单词拆分(medium)
题目:题解:动态规划dp[i]表示s[0]~s[i]是否可以由字典中的单词构成,是为1,不是则为0。dp[n]表示s[0]至s[n-1]是否由字段中的单词构成。初始化dp[0]=1,表示空字符串在字典中。状态转移方程:若s[0] ~ s[j]由字典中的单词构成且s[j] ~ s[i]也在字符中,则s[0]~s[i]由字典中的单词构成 ;否则s[0] ~ s[i]不是由字典中的单词构...原创 2019-11-02 21:34:01 · 258 阅读 · 0 评论 -
[完全背包]leetcode1449:数位成本和为目标值的最大数字(hard)
题目:题解:翻译下题目:给定一个物品数组,和一个体积 n,求恰好装满 n 的最大价值。其中物品数组的价值为物品编号[1,m],体积为v[0,m-1]。注意每次将可以转移的物品价值加到字符串前面,因为物品价值 i 是由小到大遍历的,只有加到前面才能保证最终的最大价值最大。代码如下:class Solution {public: // 完全背包裸题:每个物品可以使用无限次,求恰好装满n的最大价值 string largestNumber(vector<int>&原创 2022-05-14 16:41:34 · 213 阅读 · 0 评论 -
[线性dp][完全背包]leetcode70:爬楼梯(eary)
题目:题解:leetcode官方详细题解代码如下:class Solution {public: //解法1:斐波那契数 int climbStairs_1(int n) { if(n==1)return 1; int first=1,second=2; for(int i=3;i<=n;++i) ...原创 2019-09-23 23:09:30 · 254 阅读 · 0 评论 -
[完全背包]leetcode377:组合总和 Ⅳ(medium)
题目:题解:注意点:完全背包求组合数时,外层 for 循环先遍历物品,内层 for 循环再遍历背包体积,这样可保证组合数唯一。因为先遍历物品,其实就是限制物品的种类是[1,i],在此基础上上去考虑不同的背包容量,其实这里物品的选择顺序就已经固定了,比如物品1、物品3、物品5。二维状态 dp 数组是一行一行的进行更新的。完全背包求排列数时,外层 for 循环先遍历背包体积,内层 for 循环再遍历物品,这样可保证所有物品的相对顺序不同,保证排列唯一。先遍历背包,其实就是限定了背包的体积,物品原创 2022-05-14 10:22:01 · 319 阅读 · 0 评论 -
[完全背包]leetcode518:零钱兑换 II(medium)
题目:题解:思路:来自AcWing 900. 整数划分的完全背包解法。代码如下:const int M = 310, N = 5010;// 状态f[i][j]表示从前i种物品中选且总体积恰好为j的选法的方案数int f[M][N];class Solution {public: // 完全背包解法:给定m种物品的体积,每种物品可使用无限次,求恰好装满体积n的所有方案数 int change(int n, vector<int>& v) {原创 2022-05-13 15:16:02 · 297 阅读 · 0 评论