![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP动态规划
文章平均质量分 53
追光者2020
没有实力的愤怒毫无意义。
展开
-
LeetCode 115. 不同的子序列(DP)
115. 不同的子序列给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围。dp[i][j] 表示以i-1结尾的s子序列中出现以j-1结尾的个数,状态转移方程如下:当s[i-1]==t[j-1] 时,那么该字符可以使用s[i-1]来匹配,也可以不使用s原创 2021-09-20 16:15:07 · 116 阅读 · 0 评论 -
leetcode 97. 交错字符串(DP)
题目描述给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + … + snt = t1 + t2 + … + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …提示:a + b 意味着字符串 a 和 b 连接。原创 2021-08-20 16:00:55 · 122 阅读 · 0 评论 -
leetcode 673. 最长递增子序列的个数(DP)
题目描述给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。f[i] 表示以 i 结尾的子序列的长度,g[i] 表示以 i 结尾的最长上升子序列的个数原创 2021-08-20 11:28:29 · 92 阅读 · 0 评论 -
leetcode 718. 最长重复子数组(DP/二分+哈希)
题目描述给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入: A: [1,2,3,2,1] B: [3,2,1,4,7]输出:3动态规划,使用 dp[i][j] 表示以 A[i - 1]和 B[j - 1] 结尾的 最长 相同公共子串长度,属性是最大值。 在计算过程中会使用到 dp[i-1][j-1],因此下标从1开始。如果A[i - 1]和 B[j - 1]相等,那么就在dp[i-1][j-1]的基础上加1,也就是以 A[i - 2]和 B[j - 2] 为结原创 2021-08-11 11:48:33 · 181 阅读 · 0 评论 -
leetcode 96. 不同的二叉搜索树(DP)
题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例 1:输入:n = 3输出:5示例 2:输入:n = 1输出:1分析:当只有一个节点的时候,能组成的二叉搜索树只有一种,当只有两个节点的时候,能组成的二叉搜索树有两种,类似于图片中最后两种树,根节点3的左右子树。当有三个节点时,其组成的二叉树为以下几种:以1为头结点的,因为要构成二叉搜素树,因此,剩余的节点只能位于右子树,右子树的形状类似于只有原创 2021-08-07 16:42:21 · 115 阅读 · 0 评论 -
leetcode 72. 编辑距离(DP)+ 牛客 35 最小编辑代价
题目描述给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “inten原创 2021-07-26 16:26:00 · 306 阅读 · 0 评论 -
leetcode 1143 最长公共子序列(DP)
题目描述给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 =原创 2021-07-19 10:36:14 · 88 阅读 · 0 评论 -
leetcode 1312. 让字符串成为回文串的最少插入次数 (区间DP)
题目描述给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。请你返回让 s 成为回文串的 最少操作次数 。「回文串」是正读和反读都相同的字符串。示例 1:输入:s = “zzazz”输出:0解释:字符串 “zzazz” 已经是回文串了,所以不需要做任何插入操作。示例 2:输入:s = “mbadm”输出:2解释:字符串可变为 “mbdadbm” 或者 “mdbabdm” 。示例 3:输入:s = “leetcode”输出:5解释:插入 5 个字符后字符串变为 “原创 2021-07-14 21:58:10 · 186 阅读 · 0 评论 -
丢旗子问题/LeetCode 887 鸡蛋掉落问题(谷歌面试题)
LeetCode 887 鸡蛋掉落问题:给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋.请你计算并返回要确定原创 2021-06-16 10:00:37 · 408 阅读 · 0 评论 -
LeetCode 198 打家劫舍(dp) leetcode 213 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9,3,1原创 2021-06-15 11:14:33 · 82 阅读 · 0 评论 -
LeetCode 152 乘积最大数组(DP)
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。与53 最大子序和不同的是,乘积会有负数,而且两个负数相乘得正数,对整体结果的贡献与最大子序和的贡献不一样,最大子序和只要出现了负数那么对结果就有一定的影响,就会导致不是最原创 2021-06-09 17:29:53 · 134 阅读 · 0 评论 -
LeetCode 132 回文串分割Ⅱ (DP)
题目miaos给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。示例 1:输入:s = “aab”输出:1解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。示例 2:输入:s = “a”输出:0示例 3:输入:s = “ab”输出:1二重动态规划:一重动态规划求解的是回文串,判断每个子串是否是回文串,当i>j 时,空串也是回文串,其次当i<=j 时,当s[i]==s[j] 且 f[i+1原创 2021-06-08 14:45:15 · 66 阅读 · 0 评论 -
LeetCode 62 不同路径(DP)LeetCode 63. 不同路径 II
题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向下 -> 向下向下 -> 向下 -> 向右向下 -> 向右 -原创 2021-06-07 09:26:15 · 100 阅读 · 0 评论 -
LeetCode 5 最长回文子串 and LeetCode 647. 回文子串(区间DP)
题目描述给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”区间DP模板使用。基本模本如下:首先枚举区间长度,之后枚举区间的起始位置。框架如下其中区间终点计算过程:起点定义为 i ,终点定义为 j 。[i,j] 区间长度为len,因此j-i+1=len原创 2021-06-02 10:47:18 · 97 阅读 · 0 评论 -
leetcode 329. 矩阵中的最长递增路径(记忆化搜索)
题目描述给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例 1:输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]输出:4解释:最长递增路径为 [1, 2, 6, 9]。示例 2:输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]输出:4解释:最长递增路径是 [3, 4, 5, 6]。注转载 2021-05-24 15:27:03 · 204 阅读 · 0 评论 -
股票问题系列
系列一:121. 买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1原创 2021-05-19 15:55:31 · 358 阅读 · 0 评论 -
石子合并(区间DP问题)
题目描述设有 N 堆石子排成一排,其编号为 1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 4 堆石子分别为 1 3 5 2, 我们可以先合并 1、2 堆,代价为 4,得到 4 5 2, 又合并 1,2 堆,代价为 9,得到 9 2 ,再合并得到 11,总代价为 4+9+11=24;如果第二步是先合原创 2021-05-19 09:55:51 · 714 阅读 · 3 评论 -
leetcode 516. 最长回文子序列(区间DP问题)
题目描述给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。示例 1:输入:“bbbab”输出:4一个可能的最长回文子序列为 “bbbb”。示例 2:输入:“cbbd”输出:2一个可能的最长回文子序列为 “bb”。链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence区间DP问题基本模本如下:首先枚举区间长度,之后枚举区间的起始位置。框架如下其原创 2021-05-19 09:31:07 · 172 阅读 · 0 评论 -
汉诺塔问题(DP)
题目描述我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。示例1输入 2返回值 [“move from left to mid”,“move from left to right”,“move原创 2021-05-18 21:05:35 · 591 阅读 · 0 评论 -
day1:01背包问题(动态规划)
问题描述:有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。**求解:**将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。样例:输入样例4 51 22 43 44 5输出样例:8基础版本代码:(闫式分析法,小哥哥太强啦)主要寻找状态方程,分为两部分:状态方程f(i,j):要明确集合与属性,集合指的是所有只考虑前 i 个物品,总重量不超过 j 的物品的集合;求解最大值,即f(N,V)原创 2020-06-24 10:25:57 · 927 阅读 · 0 评论 -
信封嵌套问题(DP)
题目描述给n个信封的长度和宽度。如果信封A的长和宽都小于信封B,那么信封A可以放到信封B里,请求出信封最多可以嵌套多少层。示例1输入 [[3,4],[2,3],[4,5],[1,3],[2,2],[3,6],[1,2],[3,2],[2,4]]返回值 4说明:从里到外分别是{1,2},{2,3},{3,4},{4,5}。示例2输入 [[1,4],[4,1]]返回值 1备注:时间复杂度O(nlog n),空间复杂度O(n)。题解对数组进行排序,排序的规则如下:如果长相等按照宽降序原创 2021-05-18 11:13:51 · 685 阅读 · 0 评论 -
LeetCode300 最长上升子序列(DP)以及一些扩展题目
题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:nums = [7,7,7,7,7原创 2021-05-18 11:13:06 · 236 阅读 · 0 评论 -
数的划分(DP)
题目描述将整数n分成k份,且每份不能为空,任意两个方案不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5;1,5,1;5,1,1;问有多少种不同的分法。输入:n,k ( 6 < n ≤ 200,2 ≤ k ≤ 6 )输出:一个整数,即不同的分法。示例1输入 7,3返回值 4题解:参考链接class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可转载 2021-05-18 10:17:30 · 180 阅读 · 0 评论 -
day12:59. 把数字翻译成字符串(动态规划)
问题描述:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。样例输入:“12258”输出:5使用动态规划求解,首先明确三步 1)状态表示 2)状态计算 3)边界条件。在本题目中,使用 f(i) 来表示前 i 个字母可以构原创 2020-06-24 10:36:40 · 170 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数(DP)
题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]题意:掷n个骰子,每个骰子六个数字,意思是同时投这些骰子,这些骰子朝上的和出现的概率。题解:动态规划f[i][j]表示使用 i 个骰子得到的和为j 。该f[原创 2021-05-16 16:28:33 · 81 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
题目描述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。题解:动态规划,定义dp[ i ]表示以nums[ i ] 结尾的数组的最大和。dp[ i ] 可以由两部分组成,一部分是dp[i-1] +nums[i] 另一部分是 nums[i] ,因为加上前面的dp[i-1] 还不如不加。原创 2021-05-14 21:27:02 · 74 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配
题目描述请实现一个函数用来匹配包含’. ‘和’ * ‘的正则表达式。模式中的字符’.’ 表示任意一个字符,而’ * '表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”p = “a*”输出: true原创 2021-05-14 20:17:50 · 92 阅读 · 0 评论 -
不相邻最大子序列之和(打家劫舍)
题目描述给你一个n(1≤n≤105),和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。示例1输入 3,[1,2,3]返回值 4说明有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4该题目与打家劫舍性质类似。用dp[i] 来表示数组长度为i 时所构成的最大子序列和。dp[ i ] 由两部分组成,一部分是选择arr[i],那么意味着不能选取arr[i-1] ,只能选择dp[i-2],另一部分是不选择a原创 2021-05-14 10:03:54 · 294 阅读 · 0 评论 -
换钱的最少货币数
题目描述给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.【要求】:时间复杂度 O(n×aim),空间复杂度On。示例1输入 [5,2,3],20返回值 4题解:动态规划该题无法使用贪心,一开始想着排序,然后从最大的数开始分配,直到aim==0。但是有这样一种情况,[16,15,10,4] k=30 首先分配最大的那个16,aim=14,那么选择的原创 2021-05-13 19:42:05 · 206 阅读 · 0 评论 -
通配符匹配
题目描述请实现支持’?‘and’*’.的通配符模式匹配‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任何字符序列(包括空序列)。返回两个字符串是否匹配函数声明为:bool isMatch(const char *s, const char *p)下面给出一些样例:isMatch(“aa”,“a”) → falseisMatch(“aa”,“aa”) → trueisMatch(“aaa”,“aa”) → falseisMatch(“aa”, “*”) → trueisMatch原创 2021-05-08 22:35:14 · 383 阅读 · 0 评论 -
leecode 221 最大正方形 and LeetCode 1277 统计全为 1 的正方形子矩阵
题目描述给定一个由0和1组成的2维矩阵,返回该矩阵中最大的由1组成的正方形的面积示例1输入 [[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]返回值 4题解f[i][j]:表示以坐标(i,j )为右下角的且只包含1的正方形的最大值。f[i][j] = min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))+1; 为什么是这三个的最小值?直观理解,假如取到的最小值是0,那么周围无法构成一个完整的正方形,只能由m原创 2021-05-07 10:27:08 · 149 阅读 · 0 评论 -
把数字翻译成字符串(dp)and leetcode 91解码方法
题目描述有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。现在给一串数字,返回有多少种可能的译码结果。示例1输入:“31717126241541717”返回值:192 说明:192种可能的译码结果题解:使用动态规划算法,dp[i]表示前 i 个字母译码个数,由题意可知,dp[i] 可以由两部分组成,一部分是dp[i-1],指向前看一位(条件:nums[i-1] 不为0则dp[i] = dp[i-1],如果nums[i-1] 为0,则dp[i原创 2021-05-02 11:23:08 · 616 阅读 · 0 评论