动态规划
algsup
这个作者很懒,什么都没留下…
展开
-
[dp]leetcode688:骑士在棋盘上的概率(medium)
题目:题解:思路:动态规划,具体思路见代码。代码如下:int dir[][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,-2},{2,-1},{2,1},{1,2}};double dp[110][30][30];class Solution {public: // dp[step][i][j]表示走step步到达点(i,j)的概率 // 初始化:dp[0][i][j]=1表示在点(i,j)走0步的概念为1;当走step步走到(i,j)不原创 2022-02-17 11:36:40 · 239 阅读 · 0 评论 -
[dp]leetcode1218:最长定差子序列(medium)
题目:题解:思路:动态规划,dp[i] 表示以最后一个元素为 i 的差分子序列的最长长度,状态转移方程为 dp[i]=dp[i-k]+1代码如下:class Solution {public: int longestSubsequence(vector<int>& a, int k) { unordered_map<int,int> dp; int res=0; for(int i:a){原创 2022-02-05 13:28:48 · 567 阅读 · 0 评论 -
[dp(选与不选问题)]5982:解决智力问题(medium)
题目:题解:分为正向dp和倒序dp,具体可看思路:代码如下:class Solution {public: // 倒序dp(查表法):f[i]表示[i,n-1]之间问题所能得到的最大分数 /*状态转移方程:f[i]=max(f[i+1],q[0]+(j<n?f[j]:0));对于问题i,我们可以选择解决,也可以选择跳过; 选择跳过问题i的话,则f[i]=f[i+1]表示f[i]为[i+1,n-1]所能获得最大分数;选择解决问题i的话,我们就要跳过q[1原创 2022-01-16 21:13:46 · 226 阅读 · 0 评论 -
[数组][dp[]leetcode42:接雨水(hard)
题目:题解:思路:下雨后能达到的最大高度等于两边最大高度的较小值减去当前高度代码如下:class Solution {public: //思路:下雨后能达到的最大高度等于两边最大高度的较小值减去当前高度 int trap(vector<int>& height) { int n=height.size(); //l...原创 2019-12-06 15:32:39 · 195 阅读 · 0 评论 -
[dp][子序列问题]leetcode1771:由子序列构造的最长回文串的长度(medium)
题目:题解:考试时也想到拼接字符串,然而就是没想到怎么判断来自两个不同的字符串s1、s2,说到底还是没有彻底理解状态 dp[i][j] 以及状态转移方程。思路:连接 s1 和 s2为 s,将问题转换为[子序列问题][dp]leetcode516:最长回文子序列(medium),然后再加一个判断条件,来判断来自两个不同的字符串s1、s2。关于 dp 方程的求法以及遍历过程,可以看labudadong的讲解子序列问题通用思路|最长回文子序列。代码如下:const int N = 2原创 2021-02-23 11:25:38 · 230 阅读 · 0 评论 -
[区间dp]leetcode1770:执行乘法运算的最大分数(medium)
题目:题解:本题是个 区间dp 题,我本人还没有好好学过这个知识点,所以看 y总直播学习了下。等以后有时间了,再好好补这个知识点吧。思路:1)由于 w 每次只能在首尾删一个元素,可以删的最多情况是删 2m 个元素,那么当 n>=2m 时,我们可以把 num 中间的元素先删掉,因为用不到了。2)进行区间dp,状态f[i][j]表示剩余区间[i,j]的所有操作方案的集合,其值为最大分数。状态转移方程:f[i][j] = max(f[i+1][j]+w[i-1]*c[n-len],f[原创 2021-02-22 21:56:01 · 274 阅读 · 0 评论 -
[状压dp]leeccode1434:每个人戴不同帽子的方案数(hard)
题目:1434. 每个人戴不同帽子的方案数题解:思路:状压dp解法:由于本人刚学习压状dp,且在《算法竞赛进阶指南》上学习了位运算相关的知识,做了两个状压dp的题,思路是学题解的,这里贴一下,记录下吧。代码如下:class Solution {public: //思路:状压dp int numberWays(vector<vector<int>>& hats) { int maxHatId=0,n=hats.siz原创 2021-01-02 21:40:30 · 360 阅读 · 0 评论 -
[dp]leetcode712:两个字符串的最小ASCII删除和(medium)
题目:题解:动态规划,转换为求1143. 最大公共字串的ASCII码之和。状态:dp[i][j]表示t1[1…i]和t2[1…j]的LCS的ASCII码之和(下标从1开始)状态转移方程:1)若t1[i]==t2[j],则表示t1和t2的LCS增加一位ASCII了,即dp[i][j]=dp[i-1][j-1]+t1[i-1]。2)若t1[i]!=t2[j],则表示t1和t2的LCS...原创 2020-01-30 00:28:04 · 337 阅读 · 0 评论 -
[dp]leetcode1143:最长公共子序列LCS (medium)
题目:题解:动态规划的经典例题,可参考晴神的算法笔记首先先使用暴力法思考吧,设t1和t2的长度分别为m和n,那么对两个字符串中的每个字符,分别只有选和不选两个决策,而得到两个子序列后,比较两个子序列是否相同又需要O(max(m,n)),这样总复杂度为O(2m+n x max(m,n)),这样无法承受数据大的情况。动态规划求最长公共子序列(Longest Common Subsequ...原创 2020-01-30 00:24:09 · 534 阅读 · 0 评论 -
[dp]leetcode674:最长连续递增子序列(easy)
题目:题解:题解1:动态规划,dp[i]表示位置i的连续递增子序列长度,初始化为1,因为每个数字是最小的递增子序列。状态转移方程:若nums[i-1]<nums[i],则dp[i]=dp[i-1]+1;否则dp[i]=1。题解2:暴力法,暴力统计每段连续子序列的长度。代码如下:class Solution {public: //题解:动态规划,本题求的是最...原创 2020-01-28 23:07:00 · 675 阅读 · 0 评论 -
[dp]leetcode354:俄罗斯套娃信封问题(hard)
题目:题解:本题属于300. 最长上升子序列的子题,难点在于如何处理envelopes数组?解决方法当然是排序了,然而这个排序还是比较难想的,我讲一下把。排序:排序的主要作用是降维,将二维数组转换为一维数组,然后进行寻找最长上升子序列。1)若w不相同,则按w由小到大进行排序。这样做的好处是:由于w由小到大进行排序了,那么只有h是上升的才能构成上升的子序列(即w已经可套娃了,判断h是否...原创 2020-01-28 16:05:22 · 846 阅读 · 7 评论 -
[子序列问题][dp]leetcode1312: 让字符串成为回文串的最少插入次数(hard)
题目:1312. 让字符串成为回文串的最少插入次数题解:动态规划本题属于516. 最大回文子序列的子题,我们直接用字符串的长度-最大回文子序列的长度就得到最少插入次数了。leetcode题解代码如下:class Solution {public: //题解:动态规划,dp[i][j]表示表示s[i...j]的最大回文子序列长度 //状态转移方程:若s[i...原创 2020-01-06 23:53:11 · 340 阅读 · 0 评论 -
[dp]leetcode132:分割回文串 II (hard)
题目:题解:动态规划isPar[j][i]表示s[j]至s[i]是否为回文串,dp[i]表示前i个字符的最少分割次数代码如下:class Solution {public: //题解:动态规划,isPar[j][i]表示s[j]至s[i]是否为回文串,dp[i]表示前i个字符的最少分割次数 int minCut(string s) { ...原创 2019-12-20 23:32:28 · 132 阅读 · 0 评论 -
[dp]leetcode198:打家劫舍(easy)
题目:题解:题解1:关于题解1的代码若理解起来确实比较困难的话,倒不如直接看题解2的动态规划解法,因为题解1的做法跟dp做法一样的,只是没有用dp数组来保存每个状态i的值,而是每次都更新sum0和sum1,确定sum0或sum1要么为房间i-1房屋可盗窃的最大值,要么就是i-2房屋可盗窃的最大值加上当前房屋的值num[i]。题解2:动态规划dp[i]表示房间i获得最大金额数。...原创 2019-12-17 21:24:01 · 220 阅读 · 0 评论 -
[dp]leetcode5129:下降路径最小和 II (hard)
题目:题解:动态规划本题在931. 下降路径最小和的基础上多了一层for循环,用来寻找上一行中不同列的最小元素,也是对自顶向下地对原数组进行操作,时间复杂度O(n3),空间复杂度O(1)。代码如下:class Solution {public: //题解:动态规划,直接对原数组进行操作,自顶向下,时间复杂度O(n3),空间复杂度O(1) int minFall...原创 2019-12-15 09:57:19 · 216 阅读 · 0 评论 -
[dp]leetcode931:下降路径最小和(medium)
题目:题解:动态规划本题属于120. 三角形最小路径和的子题,区别在于每个点的路径和可以依靠上一行的任一个数据,也就是说我们的遍历每个点可以上一行的三个路径和选择最小的即可,这样就表示可以取上一行的任一数据了。至于自顶向下寻找最小路径和,还是从下到上寻找,这个没啥区别。代码如下:class Solution {public: //题解:动态规划,自顶向下对原数组进行操...原创 2019-12-15 09:25:11 · 181 阅读 · 0 评论 -
[dp]leetcode91:解码方法(medium)
题目:题解:思路:动态规划,注意0不能单独解码,还有两位数必须在1至26之间状态转移方程为:dp[i+1]=dp[i-1]+dp[i]若s[i]为0的话,dp[i]=0,dp[i+1]=dp[i-1],因为0无法解码;而dp[i-1]的解码的条件是数字必须在1-26之间,否则dp[i+1]=dp[i]代码如下:class Solution {public: //思路...原创 2019-12-12 20:14:23 · 217 阅读 · 0 评论 -
[dp]leetcode64:最小路径和(medium)
题目:题解:本题是动态规划的经典好题,状态方程也比较简单。dp[i][j]表示原点坐标达到点[i,j]的最小路径和权值,状态转移方程:dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i][j];代码如下:class Solution {public: //题解:动态规划,dp[i][j]表示到达点[i,j]的最小路径和 //注...原创 2019-12-09 09:02:37 · 171 阅读 · 0 评论 -
[动态规划]leetcode32:最长的有效括号(hard)
题目:题解:动态规划,dp[i]表示以i结尾的最长有效括号长度当匹配到右括号时,我们需要尝试向前匹配左括号,如果是左括号,则要更新匹配长度代码如下:class Solution {public: //题解:动态规划,dp[i]表示以i结尾的最长有效括号长度 int longestValidParentheses(string s) { if(s...原创 2019-12-04 17:07:14 · 177 阅读 · 0 评论 -
[dp]leetcode1277: 统计全为 1 的正方形子矩阵(medium)
题目:1277. 统计全为 1 的正方形子矩阵题解:与221. 最大正方形一样的题,不过就是将计算最大边长改为计算最大边长的累加和。代码如下:class Solution {public: //与221.最大正方形思路是一样的,只不过将计算最大长度改成了计算最大长度的累加和 int countSquares(vector<vector<int>...原创 2019-12-03 11:10:19 · 322 阅读 · 0 评论 -
[dp]leetcode221:最大正方形(medium)
题目:题解:动态规划建立一个比原始矩阵维度多一的dp[m+1][n+1]数组,其中dp[i][j]表示由“1”构成的最大正方形的边长状态转移方程:dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1可以看下图理解这个状态转移方程:代码如下:class Solution {public: //题解:动态规划,dp[i...原创 2019-12-03 11:04:51 · 251 阅读 · 0 评论 -
[分治法][动态规划]leetcode312:戳气球(hard)
题目:题解:题解1:分治法每次选的第k个球用来最后戳爆,然后根据k的位置划分左右区间,分别求解,最后区间只有一个值时,子问题解决,那么总问题也解决了。题解2:动态规划其实和分治法一样的算法思路,只不过通过迭代实现罢了。dp[i][j] 表示戳破 [i+1…j-1] 号气球的最大收益代码如下:class Solution {public: //解法1:分治法...原创 2019-11-26 20:55:58 · 442 阅读 · 0 评论 -
[dp]leetcode1262:可被三整除的最大和(medium)
题目:题解:动态规划本题在打周赛的时候是挺难想的,数学方法然后用dp递推出来的,确实很难的。dp[i]表示总和取模3为i的数字总和。举例:假定num[i]%3=1,那么我们需要和前面数字总和为2的dp[2]相加,这样可以得到dp[0]了,所以dp[0]=max(dp[0],dp[2]+nums[i])了。依次类推,只要不断更新dp数组即可,注意一点,更新的时候要保存上一个状态的值,...原创 2019-11-18 20:25:30 · 413 阅读 · 0 评论 -
[回溯][dp]leetcode44:通配符匹配(hard)
题目:44.通配符匹配题解:解法1:回溯法last:用来记录最后一次匹配的位置;star:用来记录*的位置开始进行匹配,若i小于s串的长度,进行for循环。若当前两个字符相等,或着p中的字符是问号(?),则i和j分别加1。若 p[j] 是星号,要记录星号的位置,star赋为j,此时j再自增1,last赋为i。若当前 p[j] 不是星号,并且不能跟 p[i] 匹配上,此时就要靠*了...原创 2019-11-10 23:50:17 · 369 阅读 · 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 · 248 阅读 · 0 评论 -
[dfs+dp][回溯]leetcode131:分割回文串(medium)
题目:题解:解法1:dfs+dp先建立dp数组,与5.最长回文子串算dp数组一样,然后就是dfs寻找所有的可行解了。解法3:回溯法思想与N皇后的回溯法差不多的模板,寻找到所有的可行解后,回溯完成!题解①代码:class Solution {private: vector<vector<string>> result; vect...原创 2019-11-02 20:56:56 · 251 阅读 · 0 评论 -
[dp][马拉车算法][中心扩展法]leetcode5:最长回文子串(medium)
题目:题解:①:动态规划dp[i][j]表示s[i]至s[j]所表示的子字符串是否为回文串,是则为1,不是则为0。这样可根据s[i]是否等于s[j],可以把转移情况分为两类:1)若s[i]==s[j],那么只要s[i+1]至s[j-1]是回文串,那么s[i]至s[j]就是回文串;如果s[i+1]至s[j-1]不是回文串,则s[i]至s[j]就不是回文串。2)若s[i]!=s[j],...原创 2019-10-29 00:34:19 · 299 阅读 · 0 评论 -
[滑动窗口][dp]leetcode978:最长湍流子数组(medium)
题目:题解1:滑动窗口题目重点语句:如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。通俗点解释就是<、>、<、>要交替出现,不能出现连续的>、>或<、<或>、=或<、=。对于本题例子9 4 2 10 7 8 8 1 9,我们用-1,0,1来b表示两个数字之间的符号(小于,等于,大于),也就是说n个数字将产生n...原创 2019-10-18 21:58:53 · 479 阅读 · 0 评论 -
[dp]leetcode718:最长重复子数组(medium)
题目:题解:本题是动态规划的经典例题,与最长公共子序列是同一类型题。本题求的是最长重复子数组,但是这个子数组不一定要连续,比如[1,2,3,4,5]与[1,7,4,5]二者的最长公共子序列为[1,4,5]。注意这里的i与j都是从1开始的。关于dp[i][j]表示数组A的i号位与数组B的j号位之前的LCS长度(最长公共子序列长度)。比如:dp[3][1]表示[1,2,3]与[1]的LC...原创 2019-10-15 19:53:25 · 217 阅读 · 0 评论 -
[dp]leetcode121:买卖股票的最佳时机(easy)
题目:题解:dp 七行代码简约风格!代码如下:class Solution {public: int maxProfit(vector<int>& prices) { int last = 0, profit = 0; for (int i = 0; i < (int)prices.size() - 1; ++i) ...原创 2019-10-09 23:16:12 · 204 阅读 · 1 评论