动态规划
ryontang
这个作者很懒,什么都没留下…
展开
-
打家劫舍问题
198.打家劫舍主要思路:第i个房间选还是不选若选:则第i-1个房间不能选,当前抢劫的钱为:dp[i-2]+rooms[i-1]若不选:则第原创 2020-10-06 16:37:24 · 488 阅读 · 0 评论 -
最大正方形面积/数量(单调栈)
221最大正方形面积主要思路:这一题参考官方题解的视频讲解和思路暴力法,暴力法主要思路:当matrix[i][j]==1时,假设其为最大正方形左上角,用min(row-i,col-j)作为最大边长,从左上角出发,在最大边长的for循环下,检查有无0的情况:先检查下一行下一列([i+k][j+k]), 若通过,在检查下一行下一列的所有元素matrix[i+k][j+m] || matrix[i+m][j+k]返回一个最大边长动态规划的方法:状态:dp[i][j]:表示以(i,j)为右下角原创 2020-09-07 20:58:18 · 811 阅读 · 0 评论 -
正则表达式匹配/通配符匹配
全文参考labuladong10.正则表达式匹配1. 状态和选择dp[i][j] 表示 s 的前 i 个是否能被 p 的前 j 个匹配2. base casedp[0][0]=true # s与j是" "空字符,当然可以匹配3. 状态转移方程怎么想转移方程?首先想的时候从已经求出了 dp[i-1][j-1]入手,再加上已知 s的第i个字母s[i-1]、p的第j个字母p[j-1],要想的问题就是怎么去求 dp[i][j]分情况讨论:考虑最简单的 p[j-1] == s[i-1] .原创 2020-09-02 21:54:55 · 3623 阅读 · 0 评论 -
背包9讲_求背包问题的方案
0~1背包问题的方案主要思路:先把所有的状态求出来,再反推我们的方案#include <iostream>#include <algorithm>using namespace std;const int MAXN =1005;int w[MAXN]; // 价值int v[MAXN]; // 物品所占体积int f[MAXN]; // f[i][j]背包容量为j下可选前i个物品的最大价值(背包不一定被装满)int x[MAXN];int main(原创 2020-08-28 14:02:22 · 115 阅读 · 0 评论 -
背包9讲_背包问题求方案数
根据f[j]初始化不同会有两种解法即f[]状态的定义不同,会有不同的状态转移方程;具体参考acwing我们采用与0~1背包相似的状态方程定义方式:f[i][j]表示从前i个物品中选择,体积不超过j的价值,g[i][j]表示从前i个物品中选择体积不超过j的最大价值对应方案数先初始化所有的 cnt[i]为 1,因为背包里什么也不装也是一种方案外层循环 n次,每次读入新物品的 v,w求出装新物品时的总价值,与不装新物品时作对比如果装新物品的方案总价值更大,那么用 f[j−v]+w来更新 f[j原创 2020-08-27 21:30:40 · 591 阅读 · 0 评论 -
背包9讲_分组背包问题
主要思路:1.先把每组看成一个整体,把这个整体当成0~1b背包问题来处理2.在整体选择下每组的物体进行一个循环,选择每组的一个最优的结果背包问题:for 物品种类for 背包容量for 选择策略:1. 对于0~1背包就是选或者不选(若一维优化:背包容量倒序)2. 对于完全背包就是选或者不选(若一维优化:背包容量不需倒序)3. 对于多重背包问题:就是二进制拆成基类物品,再对基类物品进行0~1选择4. 对于分组背包问题:在选择策略中就是,每组内的物品进行一个循环,选择/不选择 最优的一个物.原创 2020-08-27 20:28:39 · 885 阅读 · 0 评论 -
背包9讲_二维费用的背包问题
主要思路:在0~1背包的基础上增加一个重量限制维度参考acwing#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N=110;int n,v,m; // 物品件数,背包体积,背包最大承重int f[N][N];int main(){ int v,kg,w; cin>.原创 2020-08-27 15:23:38 · 138 阅读 · 0 评论 -
背包9讲_混合背包问题
主要思路:前三种背包处理的混合型号01 背包则直接放入数据容器中多重背包则化解成 01 背包 放入数据容器中(见多重背包II习题 进行二进制优化)完全背包也直接放入数据容器中此刻数据容器vector[HTML_REMOVED] things;中就只有01背包和完全背包 那么就进行遍历处理参考acwing题解#include <iostream>#include <cstring>#include <algorithm>#include <v.原创 2020-08-27 15:00:46 · 130 阅读 · 0 评论 -
背包9讲_多重背包问题
主要思路:f[i][j]=max(f[i-1][j-k*v[i]]+k*w[i]) (0=<k<=p)与完全背包同==,只是k不是固定,所以没法优化掉k根据当前的动态规划方程写代码:// 多重背包 未优化前#include <iostream>#include <algorithm>const int MAXN = 1005;int w[MAXN]; // 重量int v[MAXN]; // 价值int s[MAXN]; // 个数int.原创 2020-08-27 14:17:12 · 120 阅读 · 0 评论 -
背包9讲_完全背包问题
主要思路:每一件物品可以选k次(k>=0)动态转移方程如下:代码(二维未优化):// 完全背包 未优化前#include <iostream>#include <algorithm>const int MAXN = 1005;int w[MAXN]; // 价值int v[MAXN]; // 重量int f[MAXN][MAXN]; // f[i][j], j重量下前i个物品的最大价值int main(){ int n,m; ci.原创 2020-08-27 10:59:34 · 84 阅读 · 0 评论 -
背包9讲_0-1背包问题
主要思路:优化成一维空间,当f[i-1][j-w[i]]->f[j-w[i]]需要采取倒序参考徐凤老师讲解参考acwing讲解// 0-1背包 未优化前#include <iostream>#include <algorithm>const int MAXN = 1005;int w[MAXN]; // 价值int v[MAXN]; // 重量int f[MAXN][MAXN]; // f[i][j], j重量下前i个物品的最大价值int main.原创 2020-08-27 10:36:52 · 199 阅读 · 0 评论 -
字符串处理-DP问题
72.编辑距离全文引用Labuladong1.思路前文「最长公共子序列」说过,解决两个字符串的动态规划问题,一般都是用两个指针 i,j 分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。设两个字符串分别为 “rad” 和 “apple”,为了把 s1 变成 s2,算法会这样进行:当i==j时,可以skip当i!=j时,可以insert/replace/delete还有一个很容易处理的情况:就是 j 走完 s2 时,如果 i 还没走完 s1,那么只能用删除操作把 s1 缩短为原创 2020-08-24 21:17:05 · 485 阅读 · 0 评论 -
背包问题
给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?举个简单的例子,输入如下:N=3, W=4;Wt=[2, 1,3]val=[4, 2, 3]动态规划标准套路1. 明确状态和选择只要给定几个可选物品和一个背包的容量限制,就形成了一个背包问题所以状态有两个,就是「背包的容量」和「可选择的物品」再说选择,也很容易想到啊,对于每件物品,你能选择什么?选择就是「装进背包」.原创 2020-08-24 11:34:32 · 391 阅读 · 0 评论 -
滑动窗口技巧
76.最小覆盖子串全文参考Labuladong#include <unordered_map>/*滑动窗口算法框架*/void slidingWindow(string s, string t){ unordered_map<char, int> need, window; for (char c : t) need[t]++; int left = 0, right = 0; int valid = 0; while (right <原创 2020-08-19 22:01:13 · 170 阅读 · 0 评论 -
动态规划四—打家劫舍问题
一、理解题意解决动态规划问题就是找「状态」和「选择」,仅此而已。假想你就是这个专业强盗,从左到右走过这一排房子,在每间房子前都有两种选择:抢或者不抢。如果你抢了这间房子,那么你肯定不能抢相邻的下一间房子了,只能从下下间房子开始做选择。如果你不抢这间房子,那么你可以走到下一间房子前,继续做选择。在两个选择中,每次都选更大的结果,最后得到的就是最多能抢到的 money:// 主函数int rob(vector<int>& nums){ return dfs(nums, 0).原创 2020-08-18 20:04:05 · 314 阅读 · 0 评论 -
动态规划三-----一个方法团灭6道股票问题
int maxProfit(vector<int>& prices){ if(prices.empty()) return 0; int s1=-prices[0], s2 = INT_MIN, S3=INT_MIN, S4=INT_MIN; for(int i =1; i<prices.size(); ++i){ s1=max(s1, -prices[i]); s2=max(s2, s1+prices[i]); s3=max(s3, s2-prices[i]原创 2020-08-16 22:05:22 · 141 阅读 · 0 评论 -
动态规划-题型二
全文参考:labuladong动态规划之博弈问题877.石子游戏解决博弈问题的动态规划通用思路本文就借石头游戏来讲讲「假设两个人都足够聪明,最后谁会获胜」这一类问题该如何用动态规划算法解决。博弈类问题的套路都差不多,下文举例讲解,其核心思路是在二维 dp 的基础上使用元组分别存储两个人的博弈结果。掌握了这个技巧以后,别人再问你什么俩海盗分宝石,俩人拿***的问题,你就告诉别人:我懒得想,直接给你写个算法算一下得了。我们石头游戏改的更具有一般性:你和你的朋友面前有一排石头堆,用一个数组 pile原创 2020-08-09 20:03:46 · 743 阅读 · 0 评论 -
动态规划—题型
300.最长上升子序列给定一个无序的整数数组,找到其中最长上升子序列的长度。输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。主要思路:上升的定义,nums[i]<nums[j],子序列的定义:不一定要求你连续最值:联想到最优子结构,dp[i]可以通过dp[i-1]来求动态规划联想到,状原创 2020-08-04 14:49:21 · 330 阅读 · 0 评论 -
动态规划答疑篇
引用: [labuladong](https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/targetsum)dp问题有两个特点:1. 重叠子问题2. 最优子结构一、最优子结构详解「最优子结构」是某些问题的一种特定性质,并不是动态规划问题专有的。也就是说,很多问题其实都具有最优子结构,只是其中大部分不具有重叠子问题,所以我们不把它们归为动态规划系列问题而已。我先举个很容易理解的例子:假设你们学校有 10 个班,你已经计算出了每个班的原创 2020-08-03 21:32:31 · 170 阅读 · 0 评论 -
动态规划解题套路框架
参考:labuladong一、斐波那契数列观察递归树,很明显发现了算法低效的原因:存在大量重复计算,比如 f(18) 被计算了两次,而且你可以看到,以 f(18) 为根的这个递归树体量巨大,多算一遍,会耗费巨大的时间。更何况,还不止 f(18) 这一个节点被重复计算,所以这个算法及其低效。这就是动态规划问题的第一个性质:重叠子问题。下面,我们想办法解决这个问题# 1.暴力递归int fib(int N){ if(N==1 || N==2){ return fib(N-1)+fib原创 2020-08-02 17:47:42 · 780 阅读 · 0 评论