![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
余丰旭
这个作者很懒,什么都没留下…
展开
-
动态规划之戳气球
leetcode312 戳气球这一题可以用动态规划来解决,但是dp含义的设置和状态转移方程的设计很有意思。首先,一维dp难以实现的,应该考虑二维dp,尤其在一个数组中,要考虑到双指针移动来解决复杂问题。如果将dp[i][j]的含义设置为戳爆下标[i,j]之间所有的气球能获得的最大钱币,会发现由于涉及到与i左边和j右边数字相乘,难以书写状态转移方程。将dp[i][j]的含义设置为:戳爆下标i和j之间(开区间)的所有气球能获得的最大钱币。此时,如果将状态转移方程写为dp[i][j]=max(先戳气球k,原创 2021-08-21 10:11:02 · 360 阅读 · 0 评论 -
leetcode10 正则表达式匹配
正则表达式匹配这一题的关键在于第一,处理好dp的初始状况(i==0, j==0的情况)第二,对复杂问题进行分类讨论。思考清楚当前匹配字符为*时的情况,*可以匹配0个,或者多个前一位的字符,抓住这个特点即可写出状态转移方程*匹配0次:如果dp[i][j-2]==true,则dp[i][j]=true*匹配多次:需要两个条件,第一:dp[i-1][j]==true,第二s当前字符必须和p中*的前一个字符匹配。(思考一下,这是一种有趣的递归写法)class Solution {public:原创 2021-08-18 23:00:53 · 80 阅读 · 0 评论 -
leetcode174 地下城游戏
这一题让我学到了两个教训:动态规划先写状态转移方程写动态规划应该思维灵活,有时需要逆向思维//先写状态转移方程,无论是递归还是动态规划/*dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]);*/class Solution {public: int calculateMinimumHP(vector<vector<int>>& dungeon) { int m=dunge原创 2021-08-11 15:54:38 · 84 阅读 · 0 评论 -
背包问题解析
0-1背包问题问题描述:有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每件物品都只有1件。样例:5 8 // n==5, V==83 5 1 2 2 // w[i]4 5 2 1 3 // c[i]答案:10使用暴力法时间复杂度为O(2n),可以使用二维DP解决该问题,时间复杂度为O(nV)。其中dp[i][j]表示:在前i个物品中挑选若干,使容量为j的背包,能装下的最大价值。那么状态转移方程即为原创 2021-04-10 11:59:07 · 164 阅读 · 0 评论 -
状态压缩dp
理解当出现NPC问题,但是题目给出的N在20左右时,一般用状态压缩dp来解决状态压缩dp本质还是动态规划,只不过是将一些不方便表示的状态用二进制数的形式来表示。例题例题1#include <iostream>#include <cstdio>using namespace std;typedef long long ll;int N, K;ll dp[9][(1 << 9)][82] = {0}; //dp[i][st][j] 表示0~i行原创 2021-05-10 21:35:49 · 145 阅读 · 0 评论 -
复杂动态规划之状态机解法
刷到leetcode309 最佳买卖股票时机含冷冻期时,学习了一种状态机的解法,觉得很好用,遂记录一下。对于这类复杂的状态转移问题,可以通过建立多个状态以及他们之间的转移方程来解决。对于该题,则定义四种状态,买入,卖出,持有,和不持有,其值代表当前状态下最大的利润。状态机及之间的转换如下:#include <vector>#include <algorithm>using namespace std;class Solution {public: int.原创 2021-04-11 15:15:38 · 155 阅读 · 0 评论 -
动态规划思考与总结
动态规划其实是运筹学的一种最优化方法,其核心思想是穷举/暴力搜索,只不过因为存在大量重叠子问题,所以需要避免重复计算。备忘录、DP table 就是在追求“如何聪明地穷举”。用空间换时间的思路,是降低时间复杂度的不二法门。动态规划三要素重复子问题存在大量重复计算的子问题最优子结构要符合「最优子结构」,子问题间必须互相独立。公众号labuladong作者对这个问题作如下解读:比如说,假设你考试,每门科目的成绩都是互相独立的。你的原问题是考出最高的总成绩,那么你的子问题就是要把语文考到最高,数原创 2021-08-06 09:51:12 · 418 阅读 · 0 评论 -
动态规划之背包问题
01背包416分割等和子集这一题,需要能想到把分割等和子集的问题转化为数组中能否凑出target2\frac{target}{2}2target。一旦转化了稳提,就变成了一个01背包问题。内层for循环从右到左,是避免重复使用一个元素。因为从左往右的话,每次利用的前面的数据都是已经处理过了的,而从右到左就不会出现这个问题。class Solution {public: bool canPartition(vector<int>& nums) { int原创 2021-08-09 08:29:02 · 87 阅读 · 0 评论