关于动态规划
文章平均质量分 69
动态规划
youngsea8
喜欢学习!
展开
-
124. 二叉树中的最大路径和 树形dp,最大深度
思路c++,动态规划,递归。树形dp。官方题解:作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-leetcode-/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。首先,考虑实现一个简化的函数 maxGain(node),该原创 2021-03-19 19:00:56 · 110 阅读 · 0 评论 -
467. 环绕字符串中唯一的子字符串 固定最后一个字母,求出所有字串的个数
思路回答一个核心的问题?如何避免重复?首先我们知道每一个字串,最后一个字符(或者是第一个字符)只有26种可能性,以字母aaa为结尾的长度为lenlenlen的字符串会产生lenlenlen个字串,那么我们用map<char,int>map<char,int>map<char,int>记录以字母charcharchar为结尾的出现的最大字串的长度,长度为map<char,int>map<char,int>map<char,int>的原创 2021-03-10 20:20:45 · 52 阅读 · 0 评论 -
1314. 矩阵区域和 类似dp的思想减少计算量
思路自己用的方法不是dpdpdp,套个dp的壳子。设dp[i][j]dp[i][j]dp[i][j]代表(r,c)(r,c)(r,c)为(i,j)(i,j)(i,j)的时候我们得到的这个小矩形的和。dp[i][j]=dp[i][j+1]+新增的最左边的那一列的和−失去的最右边那一列的和=dp[i][j+1]+∑a=i−ka=i+kmat[a][j−k]−∑a=i−ka=i+kmat[a][j+k+1]dp[i][j]=dp[i][j+1]+新增的最左边的那一列的和-失去的最右边那一列的和=dp[i]原创 2021-03-10 16:11:16 · 342 阅读 · 0 评论 -
1641. 统计字典序元音字符串的数目 几种不同的状态
数学解法高中学过的隔板方法dp思路dp[j][i],j=0,1,2,3,4dp[j][i],j=0,1,2,3,4dp[j][i],j=0,1,2,3,4末尾的字幕为jjj,长度为iii的时候我们取得的最小值字符串的数量。状态转移方程dp[0][i]=dp[i−1],dp[1][i]=dp[0][i−1]+dp[1][i−1],...,dp[4][i]=dp[0][i−1]+dp[1][i−1]+dp[2][i−1]+dp[3][i−1]dp[0][i]=dp[i-1],dp[1][i]=dp[0原创 2021-03-05 23:31:33 · 52 阅读 · 0 评论 -
837. 新21点 概率型dp
解体思路这次的dpdpdp从后面往前面,且采用累加的方式。设dp[i]dp[i]dp[i]代表当前得分为iii的时候,获胜的概率。那么dp[i]=(dp[i+1]+dp[i+2]+...+dp[i+W])/W,i=0,1,2,...,K−1dp[i]=(dp[i+1]+dp[i+2]+...+dp[i+W])/W,i=0,1,2,...,K-1dp[i]=(dp[i+1]+dp[i+2]+...+dp[i+W])/W,i=0,1,2,...,K−1这样算的话两层循环(K−1)∗W(K原创 2021-03-02 19:37:04 · 129 阅读 · 0 评论 -
787. K 站中转内最便宜的航班 图类和边相关的dp
解题思路状态定义,dp[u][v][k]dp[u][v][k]dp[u][v][k]代表从城市uuu到达城市vvv,最多经过kkk个中转站得到的最小的距离。本题中,源城市确定,显然这里上面定义状态的第一维uuu就不需要了,所以我们的状态dp[v][k]dp[v][k]dp[v][k]代表从城市srcsrcsrc到达城市vvv,最多经过kkk个中转站得到的最小的距离。初始状态,dp[src][i]=0,0<=i<kdp[src][i]=0,0<=i<kdp[src][i]=0,原创 2021-03-01 16:12:44 · 112 阅读 · 0 评论 -
300. 最长递增子序列 动态规划O(n2) 贪心+二分 O(nlogn)
思路动态规划,定义状态dp[i]dp[i]dp[i]代表以 nums[i]nums[i]nums[i]结尾的最长递增子序列的长度,这样的话dp[i]dp[i]dp[i]和其子问题dp[k],0<=k<idp[k],0<=k<idp[k],0<=k<i便产生了联系、状态转移方程dp[i]=max(dp[k]+1),0<=k<iif(nums[i]>nums[k])dp[i]=max(dp[k]+1),0<=k<i if(nums[i]&原创 2021-03-01 11:12:44 · 147 阅读 · 0 评论 -
474. 一和零 类似01背包问题
解题思路01背包问题,有n件物品,放入容量为V的背包内,每件物品的体积为a[i]a[i]a[i],价值为v[i]v[i]v[i],求背包内可装成的最大的价值。状态设置为dp[i][j]dp[i][j]dp[i][j]代表前i件物品放入容量为j的背包内,我们可以得到的最大的价值,很容易可以得到状态转移方程,这个网上的题解很多,这里不再赘述。本题,有一个字符串数组,数组的每一个元素都是一个01的字符串,现在要求从这个数组中选出若干字符串,使得这个字符串的0的个数不超过m,1的个数不超过n,求可以选出的字原创 2021-02-28 19:51:17 · 142 阅读 · 0 评论 -
123. 买卖股票的最佳时机 III
题解只能说官方的题解想法实在是太妙了官方的题解妙就妙在我根本想不到这么做,官方题解思路的下面贴了一个我的思路。官方的题解妙就妙在这句话无论题目中是否允许「在同一天买入并且卖出」这一操作,最终的答案都不会受到影响,这是因为这一操作带来的收益为零。,这样的话可以极大的减小状态转移方程的复杂程度。下面我的写法显然可以优化空间,官方题解就是这么做的。时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n),空间复杂度可以优化到O(1)O(1)O(1)class Solution {p原创 2021-02-17 15:44:44 · 50 阅读 · 0 评论 -
121. 买卖股票的最佳时机
解体思路乍一看容易被吓到,实际上很简单。只要记录[0,...,i−1][0,...,i-1][0,...,i−1]的最小值min_min\_min_就可以了,然后我们要的结果其实就是max(prices[i]−min_,res),i=0,...,n−1max(prices[i]-min\_,res),i=0,...,n-1max(prices[i]−min_,res),i=0,...,n−1更新一下题目,如果允许多次买卖,那么我们规定两种状态dp[i][0]dp[i][0]dp[i][原创 2021-02-17 13:36:35 · 70 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期
解体思路官方题解约束条件很多卖出股票只能在买入股票之后。卖出股票后需要等一天内才能继续买入股票。如果把卖出当作两天,需要对最后一天的卖出进行特殊的操作,这十分的麻烦。解决这种复杂的问题一般采用动态规划(经验所致),状态确定了转移方程都不难,难的是确定状态。如何确定状态?dp[i][j]dp[i][j]dp[i][j]代表啊第一次买入在第iii天,最后一次卖出在第jjj天可不可以?产生问题:卖出股票后需要等一天才能继续买入怎么考虑进?如何糅合入prices[i]prices[i]原创 2021-02-17 11:35:05 · 43 阅读 · 0 评论 -
1003 Emergency (25 分)
原本想dijkstra算出最小的距离后,然后bfs+剪枝去找出所有满足条件的路径,时间卡的有点紧,过前三个点,相关的bfs的代码以 “// 没有用到,// 结束没有用到框出”,实际最后没用到对dijkstra算法进行改进:dijkstra更新最短路径的过程中需要更新num[]数组(num[i]代表从开始点到点i已经累计的救援队的数量)和cnt[](cnt[i]代表从开始点到点i已经累计的路线的数量)数组,需要维护这两个数组,对于这两个数组的维护和对dijkstra的修改,需要注意的细节很多,..原创 2021-02-16 17:05:15 · 142 阅读 · 2 评论 -
322. 零钱兑换
动态规划设dp[n]dp[n]dp[n]代表amountamountamount为nnn的时候可以使用最少的硬币数量组成这个amount。那么dp[n]=minc=coins[0]...coins[n−1](dp[n−c]+1),ifi−coins>=0dp[n]=\underset{c=coins[0]...coins[n-1]}{min}(dp[n-c]+1),if i-coins>=0dp[n]=c=coins[0]...coins[n−1]min(dp[n−c]+1),ifi−c.原创 2021-01-28 18:31:08 · 107 阅读 · 0 评论 -
221.最大正方形
### 解题思路dp[i][j]代表以位置(i,j)处的空格为正方形右下角的全为1的正方形的最大的边长。dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1,if (dp[i][j]==1);dp[i][j]=0,if (dp[i][j]==0);边界,dp[i][0]=1 if dp[i][0]==1边界,dp[0][i]=1 if dp[i][0]==1暴力解法此处不再介绍,附上代码。### 代码dpdpdp解法,原创 2021-01-26 19:00:38 · 56 阅读 · 0 评论