动态规划
ChasingTheFreeWind
这个作者很懒,什么都没留下…
展开
-
LeetCode动态规划系列,最长递增子序列二维版——俄罗斯套娃信封问题!
题目 如果了解动态规划经典题目LIS(最长递增子序列)问题,那么读完这个题应该就能知道这个题其实质是让我们找信封长宽数组对的最长递增子序列。不过还有一点不同的是,LIS问题中,子序列是选取一些元素后按其原有的相对序列排列的。而这个问题中,“子序列”在选取部分元素后,并不是按其原来的相对顺序排列的,而是按照大小排列。所以,我们可以先把这个二维数组转化一下,对它排个序,它的宽由小到大排列。那长应该如何排列呢? 我们看一下对[(5, 4), (6, 4), (6, 7), (2, 3)] 长由大到小排列: (2原创 2021-09-22 22:10:17 · 196 阅读 · 1 评论 -
LeetCode动态规划系列 编辑距离 冲冲冲
温故而知新嘛! 其实讲道理,这个编辑距离其实蛮简单的啊! class Solution { public int minDistance(String word1, String word2) { int N = word1.length(); int M = word2.length(); if(N==0) return M; if(M==0) return N; in原创 2021-02-06 19:54:39 · 93 阅读 · 0 评论 -
LeetCode动态规划系列 打家劫舍 冲冲冲!
打家劫舍系列问题 打家劫舍一 思路 显然,对于每家小偷都有打或不打两种情况,用dp[i][j]表示前i家小偷打劫的最大收益,并用j标记是否打劫第i家,于是很容易想到如下递推式: dp[i][0] = max(dp[i-1][0], dp[i-1][1]); dp[i][1] = max(dp[i-1][0], dp[i-2][1]) + nums[i] 该式子又可以简化一下: dp[i] = max(dp[i-1], dp[i-2] + nums[i]) class Solution { publ原创 2021-02-04 15:11:39 · 79 阅读 · 0 评论 -
LeetCode动态规划系列 买卖股票 冲冲冲!
递推式 6个问题全解决 dp[i][j][k]: 第i天 至多k次交易 (0无1有) dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + price[i]) dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - price[i]) 买入时认为是一次交易 dp[-1][k][0] = 0 dp[-1][k][1] = -INF //第-1天不可能有股票 dp[i][0][0] = 0; dp[i][0][1原创 2021-02-03 16:16:06 · 64 阅读 · 0 评论 -
leetcode每日一题 87.扰乱字符串(递归、动态规划)
题目链接 递归 自顶向下的思路 class Solution { public: bool judge(string s1, string s2) { if(s1==s2) return true; int N = s1.length(); string t1 = s1; string t2 = s2; sort(t1.begin(),t1.end()); sort(t2.原创 2020-06-10 10:56:33 · 181 阅读 · 2 评论 -
leetcode每日一题 面试题46. 把数字翻译成字符串 (动态规划)
很简单的一个动态规划 class Solution { public: int translateNum(int num) { stringstream ss; ss<<num; string s = ss.str(); int N = s.length(); vector<int> dp; dp.resize(N+1); dp[0] = 1; d.原创 2020-06-09 10:21:35 · 129 阅读 · 0 评论 -
leetcode 91.解码方法(动态规划)
代码 dp[i] = dp[i-1] + dp[i-2] ((s[i-2]-‘0’)*10+s[i-1]) dp[i] = dp[i-1] others 这题还需要注意0的判定。。。 "01"的答案是0,"10"的答案是1 class Solution { public: int numDecodings(string s) { int N = s.length(); if(s[0]=='0') .原创 2020-05-25 13:02:42 · 127 阅读 · 0 评论 -
树形dp入门(未完待续)
没有上司的舞会 树形dp 用vector建图,找到没有boss的那个点,从这个点开始dfs 而每个点都有两种情况,一是选择这个点取得的最大值和不选取得最大值,dp[i][1]表示选择这个点时的最大值, dp[i][0]表示不选这个点取得最大值,方程式为 dp[x][0]+=max(dp[i][1],dp[i][0]);dp[x][1]+=dp[i][0]; #include <iostream> #include <cstdio> #include <vector> #原创 2020-05-15 00:44:09 · 166 阅读 · 0 评论 -
背包九讲的简单讲解与实现
简介 动态规划的思想是非常容易理解的,但是对于某个问题要想到对应的递推式往往不那么容易。学习过01背包、完全背包,可是在我脑中的印象似乎并不那么深刻,为了巩固与提升,看了B站某大佬讲解,讲得细致、透彻,收获颇丰。为了巩固与提升,写一篇博客记录一下。 01背包 首先来看最简单的背包问题 思路 设dp[i][j]为前i件物品共选中体积为j物品的最大价值。 对于每一个物品都有选和不选两种情况,那么就有递推式dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+w[i]) 代码1原创 2020-05-13 21:34:40 · 390 阅读 · 0 评论 -
leetcode每日一题983. 最低票价(动态规划)
思路 不是很难的动态规划,但是最开始一些边界条件没考虑到,WA了好几次,然后面向测试用例debug。 设dp[i]为前i天(含)旅游花费的最小金额。 dp[i] = min{dp[i-1] + costs[0], dp[i-7] + costs[1], dp[i-30]+costs[2]} 然后两个旅游日之间的日子旅游最小花费就等于前一个旅游日的最小花费。即dp[j] = dp[days[i]]...原创 2020-05-06 12:37:49 · 249 阅读 · 0 评论 -
leetcode每日一题-面试题08-11 硬币
参考链接 是个动态规划 const int MOD = 1e9+7; class Solution { public: int waysToChange(int n) { vector<long long> dp; int val[4] = {25, 10, 5, 1}; dp.resize(n+1); ...原创 2020-04-23 21:21:49 · 183 阅读 · 0 评论 -
leetcode-72 编辑距离(动态规划)
题目链接 动态规划 递推式: if(word1[i]==word2[j]) dp[i][j] = dp[i-1][j-1]+1 else dp[i][j] = min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) class Solution { public: int minDistance(string word1, string word2) { ...原创 2020-03-30 00:05:35 · 134 阅读 · 0 评论 -
HDU1176 免费馅饼(动态规划)
Problem Description Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy...原创 2018-11-08 20:13:15 · 187 阅读 · 0 评论 -
HDOJ 1003 Max Sum(动态规划)
题目链接 题目分析: 用dp[i]表示第i个数结尾的最大和 dp[i+1]=max(dp[i]+ar[i+1],ar[i+1]); 即以第i+1个数结尾的最大和为max{第i个数结尾的最大和+第i+1个数的值,第i+1个数的值} 要求子串的最大值,还需用一个变量保存,并在更新答案时将串的结尾索引记录下来 完成之后,再从结尾向前累加直到与求到的最大值相等找到开头的索引。 #include <i...原创 2018-11-10 15:21:28 · 131 阅读 · 0 评论