![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划专题
文章平均质量分 70
田园诗人之园
我是一位平凡的诗人,也是一位平凡的工程师。
展开
-
动态规划-杨辉三角
该算法题分别是:118. 杨辉三角。119. 杨辉三角 II在「杨辉三角」中,每个数是它左上方和右上方的数的和。输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]输入: numRows = 1输出: [[1]]1原创 2023-07-06 12:59:33 · 1088 阅读 · 42 评论 -
动态规划-最长的回文序列
该题是lintcode上,该题的解题思路亦是参考了九章侯老师的解题思路给出。原创 2023-06-14 13:15:26 · 712 阅读 · 8 评论 -
动态规划-背包问题(三)
该题是lintcode上的算法题,该题的解题思路是按照九章侯老师给的方法去实现的。原创 2023-06-12 23:16:29 · 472 阅读 · 5 评论 -
动态规划-背包问题(二)
该题是lintcode上的算法题,该题的解题思路是按照九章侯老师给的方法去实现的。原创 2023-06-08 23:08:05 · 579 阅读 · 9 评论 -
动态规划-背包问题 V
该算法题是lintcode上的,算法解题思路以及方法是参考九章侯老师的方法去实现的。原创 2023-06-08 13:09:21 · 211 阅读 · 1 评论 -
动态规划-Backpack VI
给定N个正整数:A0,A1,…,An-1一个正整数Target求有多少中组合加起来是Target每个Ai可以用多次。原创 2023-06-07 23:56:49 · 223 阅读 · 6 评论 -
动态规划-背包问题
这是一个九章lintcode上的动态规划算法题,该题的解题思路基于九章侯老师的讲解给出。原创 2023-06-06 08:36:55 · 402 阅读 · 2 评论 -
动态规划-石子游戏
当 i = j 时,只剩最后一个石堆,当前玩家取走该堆石子,因此对于所有的 0 <= i < nums.length,都有f[i][i] = piples[i]。在最开始的时候,Alice作为先手先去取一堆石头,当Alice取走该堆石头之后,则Bob变为剩余石碓的先手,依次交替下去,直到取走最后一堆石头为止。当 i < j 时,当前玩家可以选择取走piles[i] 或 piles[j] 这两堆石子中的一堆,然后由另一个玩家在剩余的石堆中选出一堆石子取走。输入:piles = [5,3,4,5]原创 2023-06-01 23:53:13 · 461 阅读 · 10 评论 -
动态规划-硬币排成线
该题是lintcode的第394题,,解题思路参考九章侯老师给的建议。原创 2023-06-01 13:28:29 · 664 阅读 · 4 评论 -
动态规划-书籍复印
这些书排成一行,每个人都可以索取连续一段的书。例如,一个抄书人可以连续地将书从第i册复制到第j册,但是他不能复制第1册、第2册和第4册(没有第3册)。为了让最慢的抄书人能在最早的时间完成书的分配,最好的策略是什么?解释: 第一个人复印前两本书, 耗时 5 分钟. 第二个人复印第三本书, 耗时 4 分钟.给定n本书,第i本书有pages[i]页。输入: pages = [3, 2, 4], k = 2。输入: pages = [3, 2, 4], k = 3。书籍页数总和小于等于2147483647。原创 2023-05-31 13:45:35 · 1090 阅读 · 0 评论 -
动态规划-分割回文串 II
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。计算f[0],f[1],f[2],…根据奇和偶数回文串的特点采用下面的方式去处理。返回符合要求的 最少分割次数。来源:力扣(LeetCode)输入:s = “aab”s 仅由小写英文字母组成。输入:s = “ab”输入:s = “a”原创 2023-05-25 13:14:51 · 623 阅读 · 14 评论 -
动态规划-完全平方数
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。设设f[i]表示i最少被分成几个平方数之和。设f[i]表示i最少被分成几个平方数之和。初始条件:0被分成0个完全平方数之和。解释:12 = 4 + 4 + 4。来源:力扣(LeetCode)解释:13 = 4 + 9。原创 2023-05-24 22:22:16 · 856 阅读 · 2 评论 -
动态规划-俄罗斯套娃信封问题
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]著作权归领扣网络所有。输入:envelopes = [[1,1],[1,1],[1,1]],表示第 i 个信封的宽度和高度。注意:不允许旋转信封。原创 2023-05-22 23:05:21 · 506 阅读 · 4 评论 -
动态规划-买卖股票的最佳时机 IV
解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4。随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3。解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2。输入:k = 2, prices = [3,2,6,5,0,3]原创 2023-05-17 23:40:52 · 505 阅读 · 0 评论 -
动态规划-买卖股票的最佳时机 II and III
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。输入:prices = [3,3,5,0,0,3,1,4]原创 2023-05-16 23:22:33 · 543 阅读 · 0 评论 -
动态规划-斐波那契数
斐波那契数是一个很好的熟悉和理解动态规划的例子,通过斐波那契数可以更好的理解动态规划的精髓,动态规划是后面的计算是如何借助于前面的计算结果来加快计算速度的。原创 2023-05-15 23:10:36 · 1304 阅读 · 2 评论 -
动态规划- 打劫房屋 II
由于房子0和房子n - 1 是相临的,那我们可以分别假设不偷房子0和房子n - 1时可以偷的最大金币数;给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下, 你最多可以得到多少钱。,这就意味着第一间房子和最后一间房子是挨着的。在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的。解决这种问题的思路是首先要破圈,将圈破坏掉这样就成了打劫房子的题型了;输入: nums = [2,3,2,3]输入: nums = [3,6,4]原创 2023-05-10 08:36:24 · 569 阅读 · 2 评论 -
动态规划-打劫房屋
f[i] = max{f[i - 1], f[i - 2] + a[i - 1]} 表示在我不偷i - 1栋房子的时的最多金币数和偷第i - 1栋房子金币的最多金币数。f[i][0] = max{f[i-1][0], f[i-1][1]} 因为不偷房子i - 1,所以房子i - 2可以选择偷与不偷。f[i][1] = f[i-1][0] + a[i - 1] 因为要偷房子i - 1,所以房子i - 2必须不偷。f[i][1] 表示偷房子i - 1的前提下,前i栋房子最多能偷的金币数。原创 2023-05-10 00:10:24 · 666 阅读 · 0 评论 -
动态规划-房屋染色 II
费用通过一个nxk 的矩阵给出,比如cost[0][0]表示房屋0染颜色0的费用,cost[1][2]表示房屋1染颜色2的费用。找到油漆所有房子的最低成本。正常情况下,油漆前i栋房子并且房子i-1是颜色1,颜色2…颜色k的最小花费分别为f[i][0],f[i][1] …这里有n个房子在一列直线上,现在我们需要给房屋染色,共有k种颜色。每个房屋染不同的颜色费用也不同,你希望每两个相邻的房屋颜色不同。三个屋子分别使用第1,2,1种颜色,总花费是10。只有一种颜色,一个房子,花费为5。原创 2023-05-08 09:31:22 · 419 阅读 · 0 评论 -
动态规划-最长递增子序列
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。采用双层循环的方式去处理,每次从0 开始去统计到当前坐标i的最长连续子序列。商业转载请联系官方授权,非商业转载请注明出处。解释:最长递增子序列是 [2,3,7,101],因此长度为 4。输入:nums = [10,9,2,5,3,7,101,18]输入:nums = [7,7,7,7,7,7,7]输入:nums = [0,1,0,3,2,3]原创 2023-05-07 16:25:32 · 888 阅读 · 0 评论 -
动态规划-最少的硬币数目
动态规划是一种解决数学问题的思维,其出发点是借助于前面计算的结果,从而避免重复计算,进而减少计算量,优化计算模型。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。若可以拼接出x,则f[x]依赖转移方程计算出有效值,否则f[x] = INT_MAX (无穷大)该问题为一个动态规划类问题,虽然可以通过递归的方式解决该问题,但是复杂度会呈现出指数级别;最后一步(对于该题,最有策略则是要确认最后一枚硬币Ak(coins数组中的一种))你可以认为每种硬币的数量是无限的。3,初始条件和边界情况。原创 2023-05-06 21:30:37 · 965 阅读 · 1 评论 -
动态规划之数字n二进制位中1的个数
数字n二进制位中1的个数原创 2022-06-01 20:30:17 · 285 阅读 · 0 评论 -
动态规划之最小路径之和
动态规划之最小路径之和题目描述题解题目描述给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12提示:m == grid.lengthn == grid[i].l原创 2022-05-31 18:09:43 · 249 阅读 · 0 评论 -
动态规划之最长连续递增序列
动态规划之最长连续递增序列题目描述题解题目描述给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。示例 1:输入:nums = [1,3,5,4,7]输出:3解释:原创 2022-05-31 17:19:14 · 246 阅读 · 0 评论 -
动态规划之解码方法
动态规划之解码方法题目描述题解题目描述一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> "1"'B' -> "2"...'Z' -> "26"要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由原创 2022-05-31 16:40:01 · 234 阅读 · 0 评论 -
动态规划-粉刷房子
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。著作权归领扣网络所有。表示第 1 号房子粉刷成绿色的花费,以此类推。表示第 0 号房子粉刷成红色的成本花费;请计算出粉刷完所有房子最少的花费成本。来源:力扣(LeetCode)原创 2022-05-31 15:58:04 · 417 阅读 · 0 评论 -
动态规划之乘积最大子数组
动态规划之乘积最大子数组题目描述题解题目描述给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32 位 整数。子数组 是数组的连续子序列。示例 1:输入: nums = [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: nums = [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。提示:1 <原创 2022-05-31 08:28:31 · 326 阅读 · 0 评论 -
动态规划-跳跃游戏
动态规划之跳跃游戏题目描述:题解:动态规划解法:贪心法题目描述:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置原创 2022-05-31 07:50:33 · 380 阅读 · 0 评论 -
动态规划之最大子数组和
动态规划之最大子数组和题目描述题目描述给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [5,4,-1,7,8]输出:23提示:1 <= nums.length &原创 2022-05-19 23:40:00 · 199 阅读 · 0 评论 -
动态规划之不同路径 II
动态规划之不同路径 II题目描述题解解题方法C 实现题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例 1:输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的原创 2022-05-18 09:19:29 · 365 阅读 · 0 评论 -
动态规划-不同路径
动态规划是一种解决数学问题的思维,其出发点是借助于前面计算的结果,从而避免重复计算,进而减少计算量,优化计算模型。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。来源:力扣(LeetCode)问总共有多少条不同的路径?原创 2022-05-17 14:27:30 · 248 阅读 · 0 评论 -
动态规划之换硬币
换硬币 · Coin Change换硬币 · Coin Change描述题解C++实现换硬币 · Coin Change描述给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.你可以假设每种硬币均有无数个总金额不会超过10000硬币的种类数不会超过500, 每种硬币的面额不会超过100样例样例1输入:[1, 2, 5]11输出: 3解释: 11 = 5 + 5 + 1样例2原创 2022-05-17 09:10:02 · 692 阅读 · 0 评论