动态规划
文章平均质量分 70
嘻嘻哈哈樱桃
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
一和零力扣--474
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。此时大家可以回想一下01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。给你一个二进制字符串数组。原创 2025-03-25 15:57:54 · 449 阅读 · 0 评论 -
目标和力扣--494
给你一个非负整数数组nums和一个整数target。向数组中的每个整数前添加'+'或'-',然后串联起所有整数,可以构造一个2'+'1'-'"+2-1"返回可以通过上述方法构造的、运算结果等于target的不同的数目。5一共有 5 种方法让最终目标和为 3。1。原创 2025-03-25 15:26:19 · 379 阅读 · 0 评论 -
最后一块石头的重量||力扣--1049
一堆的石头重量是sum,那么我们就尽可能拼成 重量为 sum / 2 的石头堆。这样剩下的石头堆也是 尽可能接近 sum/2 的重量。那么此时问题就是有一堆石头,每个石头都有自己的重量,是否可以 装满 最大重量为 sum / 2的背包。组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],原创 2025-03-19 10:51:42 · 438 阅读 · 0 评论 -
分割等和子集力扣--416
给你一个的数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。true数组可以分割成 [1, 5, 5] 和 [11]。false数组不能分割成两个元素和相等的子集。原创 2025-03-19 10:12:04 · 397 阅读 · 0 评论 -
正数拆分力扣--343
递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));确定遍历顺序,先来看看递归公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});枚举j的时候,是从1开始的。原创 2025-03-13 10:24:17 · 547 阅读 · 0 评论 -
不同路径II力扣--63
在初始化的时候,我们初始化的是第一行和第一列,在遇到障碍之前,都可以初始化为1,遇到障碍,他后面的无论如何也过不去,所以是0。在 遍历找路径的时候,当没有遇到障碍的时候,递推公式同力扣62,如果遇到障碍,那么就过不去,因为他只能往上和右走。1. 向右 -> 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右 -> 向右。机器人每次只能向下或者向右移动一步。返回机器人能够到达右下角的不同路径数量。机器人的移动路径中不能包含。3x3 网格的正中间有一个障碍物。测试用例保证答案小于等于。原创 2025-03-13 09:43:04 · 322 阅读 · 0 评论 -
不同路径力扣--62
这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。原创 2025-03-13 09:13:27 · 460 阅读 · 0 评论 -
使用最小花费爬楼梯力扣--746
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。- 支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。示例 2:输入:cost = [1,100,1,1,1,100,1,1,100,1]输出:6解释原创 2025-03-12 10:16:29 · 542 阅读 · 0 评论 -
爬楼梯力扣--70
题目中给的n的范围是从1到45,所以是正整数,如果按照我们给dp的定义的话,他代表的是爬到第0层有多少种方法,由于给的范围压根没有0,所以对于dp【0】为多少的讨论是没有意义的,可以直接初始化dp【1】和【2】,然后再计算。不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。爬到第i层楼梯,有dp[i]种方法。原创 2025-03-12 09:47:56 · 360 阅读 · 0 评论 -
斐波那契数列力扣--509
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。F(n) = F(n - 1) + F(n - 2),其中 n > 1。开始,后面的每一项数字都是前面两项数字的和。dp[i]的定义为:第i个数的斐波那契数值是dp[i]用一个一维dp数组来保存递归的结果。表示)形成的序列称为。原创 2025-03-12 09:28:22 · 369 阅读 · 0 评论 -
动态规划理论基础
然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。原创 2025-03-11 17:14:44 · 318 阅读 · 0 评论
分享