LeetCode动态规划C++
文章平均质量分 64
动态规划
Gikachu
这个作者很懒,什么都没留下…
展开
-
CSP-202303-2-垦田计划
CCF第二题的套路感觉就是下手之前先想清楚哪部分能优化,现在的第二题感觉都是些递归的思想,题目要求我们把开垦时间缩短为最小天数,同时还要满足不能小于给定的最小天数,判断如何缩短当前最大天数,仅需知道如果要缩减这一天需要消耗多少的资源 ,与当前剩余资源比较即可得知能否缩减当天。据估算,其中第 i 块(1≤i≤n)区域的开垦耗时为 ti 天。如何维护这个数组便是我们需要思考的问题,要缩减第i天,那么要在第i天消耗的资源数上加上第i+1天消耗的资源数量。输出一个整数,表示开垦 n 块区域的最少耗时。原创 2023-05-22 21:40:52 · 754 阅读 · 0 评论 -
CSP-202212-2 训练计划
大部分科目的训练可以同时进行,即顿顿在同一天内可以同时进行多项科目的训练,但部分科目之间也存在着依赖关系。如果科目 i 依赖科目 j,那么只能在后者训练结束后,科目 i 才能开始训练。还好,顿顿需要训练的 m 项科目依赖关系并不复杂,每项科目最多只依赖一项别的科目,且满足依赖科目的编号小于自己。具体来说,科目 5 依赖科目 2、科目 2 又依赖于科目 1,因此科目 5 最早可以从第 4 天开始训练。2)最晚开始时间:在不耽误参赛的前提下(n 天内完成所有训练),该科目最晚可以从哪一天开始训练?原创 2023-05-13 12:06:54 · 571 阅读 · 0 评论 -
CCF-202209-2-何以包邮?01背包
新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤ i ≤ n)的价格为 a[i] 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 sum 在满足包邮条件(sum ≥ x)的前提下最小。试帮助小 P 计算,最终选购哪些书可以在凑够 x 元包邮的前提下花费最小?原创 2023-05-08 12:52:30 · 687 阅读 · 0 评论 -
474. 一和零
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3。输入:strs = ["10", "0", "1"], m = 1, n = 1。解释:最大的子集是 {"0", "1"} ,所以答案是 2。来源:力扣(LeetCode)原创 2023-05-07 19:24:00 · 579 阅读 · 0 评论 -
494. 目标和
假设在数字前放加号的数字总和为x,那么放减号的数字总和为sum-x,而目标target = x-(sum-x),即x = (target+sum)/2,那么就将问题转换为了动态规划。例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1"。如果已经有一个1(nums[i]) ,有 dp[4]种方法 凑成 容量为5的背包。有了nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。著作权归领扣网络所有。原创 2023-05-07 18:21:23 · 451 阅读 · 0 评论 -
1049. 最后一块石头的重量 II
仔细阅读题目,可以发现把问题理解透彻后,其实就是将所有的石头分为大小尽可能相似的两堆,这样相撞之后剩下的石头就是最小的。dp[j]表示大小为j的背包最多能放下的石头重量,背包的大小设置为总石头重量的一半,石头的价值等于其重量。= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],原创 2023-05-06 18:48:31 · 564 阅读 · 0 评论 -
416. 分割等和子集
题目要求判断是否可以将数组分为两个子集,是两个自己的元素和相等,那么只要能找到集合出现sum/2的子集和,就说明可以分割成两个相同元素的子集。所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);本题中,只有当dp[target] == target 的时候,才能说明其可划分为两个相等的子集。本题,相当于背包里放入数值,那么物品i的重量是nums[i],其价值也是nums[i]。dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。原创 2023-05-06 15:54:09 · 674 阅读 · 0 评论 -
96. 不同的二叉搜索树
dp[i] += 以j为头结点的搜索树数量 = dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]dp[1]则是以1为头节点,左子树数量为0,右子树数量为0,dp[0]*dp[0] = 1;头节点为1时,左子树有0个节点,右子树有2个节点,2个节点的分布情况与n为2时的情况相同。头节点为2时,左子树有1个节点,右子树有1个节点,1个节点的分布情况与n为1时的情况相同。头节点为3时,左子树有2个节点,右子树有0个节点,2个节点的分布情况与n为2时的情况相同。著作权归领扣网络所有。原创 2023-05-04 12:10:51 · 705 阅读 · 0 评论 -
343. 整数拆分
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积。示例 1:输入: n = 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: n = 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。提示:来源:力扣(LeetCode)链接:https://leetcode.cn/problems/integer-break。原创 2023-05-03 21:10:46 · 627 阅读 · 0 评论 -
63. 不同路径 II
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格的左上角 (起始点在下图中标记为 “Start” )。1. 向右 -> 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右 -> 向右。3x3 网格的正中间有一个障碍物。网格中的障碍物和空位置分别用。原创 2023-05-03 20:27:37 · 392 阅读 · 0 评论 -
62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右。原创 2023-05-03 18:19:31 · 850 阅读 · 0 评论 -
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶提示:来源:力扣(LeetCode)原创 2023-05-03 17:55:38 · 713 阅读 · 0 评论 -
746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。- 支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15。原创 2023-05-03 18:10:14 · 809 阅读 · 0 评论 -
509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n)。示例 1:输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:输入:n = 3输出:2解释:F(3) = F(2) + F(1) = 1 + 1 = 2示例 3:输入:n = 4。原创 2023-05-03 17:05:18 · 1138 阅读 · 0 评论