动态规划
baj001
这个作者很懒,什么都没留下…
展开
-
LeetCode 494. 目标和
原题链接假设加法总和为x,那么减法对应的总和就是sum - x 原始的数组里面的额数都是 非负整数假设 加法总和3 减法总和 为总和减去 x 即 5-3=2所以我们要求的是 x - (sum - x) = S 即 3-(5-3)= 1 即最后的总和为 1x = (S + sum) / 2 可以得出加法总和为x的时候 的大小,可以转换为装满重量为x的背包有几种方法将有多少种组合的问题 转换为了背包问题(装满载重为size的背包有多少种方式),通过前面的数学方法,将问题转换为求背包问题的形式.原创 2022-03-12 11:38:12 · 117 阅读 · 0 评论 -
LeetCode 1049. 最后一块石头的重量 II
原题链接题目要求是从一堆石头中,每次拿两块重量分别为x,y的石头若x=y,则两块石头均粉碎;若x<y,两块石头变为一块重量为y-x的石头,求最后剩下石头的最小重量可以理解为将两块石头进行相减,若重量相同则为0,反之为其差值要让差值小,两堆石头的重量都要接近sum/2;我们假设两堆分别为A,B, A < sum/2, B > sum/2,若A更接近sum/2,B也相应更接近sum/2进一步转换:将一堆stone放进最大容量为sum/2的背包,求放进去的石头的最大重量MaxWe.原创 2022-03-11 11:01:22 · 777 阅读 · 0 评论 -
LeetCode 416. 分割等和子集
原题链接要实现能分割成两个元素和相等的子集,可以归结为背包问题只有当元素的个数为偶数的时候,才能操作,若不为偶数,则直接返回false归结为背包问题:要分成两个元素和相等的子集,即要求每一个子集的和都要是sum / 2即包的容量为 sum / 2,是否存在往包里加物品可以满足 刚好装满的问题,其实就是背包问题class Solution { public boolean canPartition(int[] nums) { if(nums == null || num.原创 2022-03-09 19:41:36 · 173 阅读 · 0 评论 -
关于背包问题
二维dp数组 01背包问题dp数组进行初始化先遍历背包还是先遍历物品都是可以的// weight数组的大小 就是物品个数for(int i = 1; i < weight.size(); i++) { // 遍历物品 for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = ma原创 2022-03-09 11:59:35 · 93 阅读 · 0 评论 -
LeetCode 96. 不同的二叉搜索树
首先明确dp数组及其下标的含义 dp[i] 是由i个节点组成且节点值从1到i互不相同的二叉树的种类数明确递推公式:对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加一共i个节点,对于根节点 j 时,左子树的节点个数为 j - 1,右子树的节点个数为 i - j初始化数组 :只需要初始化 0个节点 和 1个节点的情况确定遍历的顺序:从前向后举例推导dp数组参考来源:代码随想录原题链接class Solution { public int numTrees(.原创 2022-03-08 10:24:41 · 504 阅读 · 0 评论 -
LeetCode 343. 整数拆分
确定dp数组(dp table)以及下标的含义 dp[i]:分拆数字i,可以得到的最大乘积为dp[i]j * (i - j) 是单纯的把整数拆分为两个数相乘,而 j * dp[i - j] 是拆分成两个以及两个以上的个数相乘。如果定义dp[i - j] * dp[j] 也是默认将一个数强制拆成4份以及4份以上了。所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘.原创 2022-03-08 09:21:22 · 344 阅读 · 0 评论 -
LeetCode 63. 不同路径 II
原题链接确定dp数组(dp table)以及下标的含义dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径确定递推公式 : 因为有了障碍,(i, j)如果是障碍的话应该就 保持初始状态(初始状态为0)初始化因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0确定遍历顺序从原创 2022-03-07 11:01:26 · 175 阅读 · 0 评论 -
LeetCode 62. 不同路径
原题链接确定dp数组(dp table)以及下标的含义 dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径确定递推公式 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]dp数组的初始化 dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理确定遍历顺序这里要看一下递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都.原创 2022-03-07 10:08:24 · 122 阅读 · 0 评论 -
LeetCode 746. 使用最小花费爬楼梯
原题链接使用动态规划先定义了dp数组的含义但是递推公式 选择dp[i - 1] dp[i - 2] 中的最小值,然后还要加上当前的cost[i]。因为dp数组是计算的到达第i个台阶花费的体力值,是一个累积的过程,当从dp[i]开始上台阶的时候,应该将dp[i]的体力成本也计算在内。对dp数组进行初始化确定遍历的顺序(从前向后)推导递归数组最后返回的是到达最高位置所花费的体力值,所以在返回的时候,选择从倒数第一步和倒数第二步 中,体力值最小的一个位置。class Solution .原创 2022-03-06 11:27:45 · 119 阅读 · 0 评论 -
LeetCode 509. 斐波那契数 70. 爬楼梯
动态规划步骤:1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组原题链接 class Solution { public int fib(int n) { if(n < 2) return n; int a = 0, b = 1, c = 0; for(int i = 1; i < n; i++){ c = a + b; a原创 2022-03-06 10:20:42 · 445 阅读 · 0 评论