动态规划
文章平均质量分 58
Noric!
这个作者很懒,什么都没留下…
展开
-
Leetcode42 接雨水(dp,单调栈,双指针)
本题可以有三种解法:动态规划:对每一格注水,统计每个位置高度的左边最大值和右边最大值单调栈:按照层的方式注水,使用递减单调栈寻找注水区间双指针:两个指针从左边向中间移动,一次遍对每一格子注水动态规划:使用两个数组,分别遍历并记录每一位置左边高度的最大值,右边高度的最大值。最后每个位置内的雨水大小 min(leftmax[i],rightmax[i]) - height[i],求和得到输出。单调栈:栈自底向上坐标对应的高度,逐渐减小。当height[i] < stack.top()时,.原创 2021-12-21 16:23:55 · 275 阅读 · 0 评论 -
Leetcode139 单词拆分
这个题用dfs递归做,会超时,要用动态规划解决。关键点:如何定义能够被重复利用的dp[i]。dp[j] 表示前 jjj 字符是否能分割成字典中的单词。若要判断前 iii(i>ji > ji>j)个字符是否能够分割,仅需要判断 jjj~(i−j)(i- j)(i−j) 的字符是否在字典中。得到状态转移方程:dp[i] = dp[j] && (s.substr(j, i) is in wordDict)为了找到所有可能,将 j 从 000 ~ i−1i-1i−1 .原创 2021-12-01 17:24:44 · 82 阅读 · 0 评论 -
LeetCode337 打家劫舍 III(递归DP)
此题采用了递归+DP的思想。不想连的节点,看起来很乱无法选择。如果按照子树的递归思想组织,就能简化很多。每个节点的状态都有两种:选择 or 不选择。由此建立两张表:choose[node] 表示选择当前节点时,其子树的最大权值和skip[node] 表示不选择当前节点时,其子树的最大权值和每个节点仅与其左右子节点相接,因此可以写出状态转移方程:若选择当前节点,则其两个孩子都不能被选择。choose[node] = value + skip[l] + skip[r]若不选择,两个孩子选.原创 2021-10-06 19:11:15 · 77 阅读 · 0 评论 -
Leetcode 53 152 最大子序和&乘积
本题可以通过动态规划建表,在O(N) 时间内解决。表中的元素 dp[i]dp[i]dp[i] 代表以第 iii 个数结尾的连续子数字的最大和。由于子数组是连续的,第 iii 个元素为结尾仅有两种,要么是其本身,要么是在前一个为元素结尾的基础上加上其本身,二者取最大值。因此可写出状态转移方程:dp[i]=max(dp[i]+nums[i],nums[i])dp[i] = max(dp[i] + nums[i], nums[i])dp[i]=max(dp[i]+nums[i],nums[i])附上代码:c.原创 2021-07-19 16:40:03 · 95 阅读 · 0 评论 -
Leetcode 1931 填色问题的通用解法!
若只考虑一维,即一行或者一列的情况,还是很直观的。设网格长度为 xxx,可能的方案总共有 3×2x−13\times2^{x-1}3×2x−1 种。然而,放在二维的表格里面情况过于复杂,不能够一一列举。可以对其进行简化降维,将二维的问题简化成两个一维方向上的问题。观察,在网格中只要保证一个格子的上下、左右格子与其颜色不同就是合理的。而刚才已经讨论过长度为 xxx 的一行填色方案有 3×2x−13\times2^{x-1}3×2x−1 种,并且只有这么多种可能,除此之外的任何方案都是不合理的。也就是说.原创 2021-07-13 16:49:48 · 418 阅读 · 0 评论 -
Leetcode 1937 动态规划的优化(两次遍历)
附上代码:typedef long long ll;class Solution {public: long long maxPoints(vector<vector<int>>& points) { vector<vector<ll> > dp(points.size(), vector<ll>(points[0].size(), 0)); ll maxim = 0; .原创 2021-07-22 21:33:15 · 227 阅读 · 0 评论