![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
—动态规划
记录有关使用动态规划解答的题目
重剑DS
学的越多,越觉无知
展开
-
动态规划算法 —— LIS (最长上升子序列)
详情可见动态规划算法3——最长上升子序列力扣上的题目300. 最长上升子序列给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为O(n2) 。进阶: 你能将算法的时间复杂度降低到O(n log n) 吗?来源:力扣(LeetCode)...原创 2020-11-19 22:23:16 · 886 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II(C++)--- 动态规划 / 贪心解题
给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 ...原创 2020-11-08 13:44:46 · 262 阅读 · 0 评论 -
1024. 视频拼接(C++)---动态规划解题
题目详情你将会获得一系列视频片段,这些片段来自于一项持续时长为T秒的体育赛事。这些片段可能有所重叠,也可能长度不一。视频片段clips[i]都用区间进行表示:开始于clips[i][0]并于clips[i][1]结束。我们甚至可以对这些片段自由地再剪辑,例如片段[0, 7]可以剪切成[0, 1] +[1, 3] + [3, 7]三部分。我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,...原创 2020-10-24 09:48:26 · 7761 阅读 · 0 评论 -
576. 出界的路径数(C++)---动态规划解题
题目详情给定一个 m × n 的网格和一个球。球的起始坐标为(i,j),你可以将球移到相邻的单元格内,或者往上、下、左、右四个方向上移动使球穿过网格边界。但是,你最多可以移动N次。找出可以将球移出边界的路径数量。答案可能非常大,返回 结果 mod 109+ 7 的值。示例 1:输入: m = 2, n = 2, N = 2, i = 0, j = 0输出: 6解释:示例 2:输入: m = 1, n = 3, N = 3, i = 0, j = 1输出: 12解释...原创 2020-10-04 10:25:50 · 266 阅读 · 0 评论 -
LCP 19. 秋叶收藏集(C++)---动态规划解题
题目详情小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。示例 1:输入:leaves = "rrry原创 2020-10-01 12:08:37 · 196 阅读 · 0 评论 -
647. 回文子串(C++)---中心扩散、动态规划解法
题目详情给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:"abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:"aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"提示:输入的字符串长度不会超过 1000 。——题目难度:中等解法一:中心扩散解法对每个字符进行判断...原创 2020-08-19 09:05:55 · 339 阅读 · 0 评论 -
337. 打家劫舍 III (C++)---DFS / 动态规划解题
题目详情在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 ...原创 2020-08-05 09:19:35 · 267 阅读 · 0 评论 -
343. 整数拆分(C++)---动态规划解题
题目详情给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。——题目难度:中等分析既然找最大乘积,那最直观的就是把所有情况列出来,然后一一比较决定出最大值,但是不太可能对于每个...原创 2020-07-30 09:21:27 · 1295 阅读 · 1 评论 -
LCP 13. 寻宝(C++)---状态压缩 动态规划 + BFS
题目详情我们得到了一副藏宝图,藏宝图显示,在一个迷宫中存在着未被世人发现的宝藏。迷宫是一个二维矩阵,用一个字符串数组表示。它标识了唯一的入口(用 'S' 表示),和唯一的宝藏地点(用 'T' 表示)。但是,宝藏被一些隐蔽的机关保护了起来。在地图上有若干个机关点(用 'M' 表示),只有所有机关均被触发,才可以拿到宝藏。要保持机关的触发,需要把一个重石放在上面。迷宫中有若干个石堆(用 'O' 表示),每个石堆都有无限个足够触发机关的重石。但是由于石头太重,我们一次只能搬一个石头到指定地点。迷宫原创 2020-07-29 14:31:34 · 761 阅读 · 0 评论 -
410. 分割数组的最大值(C++)---动态规划、二分查找 + 贪心 解题
题目详情给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 1000 1 ≤ m ≤ min(50, n)示例:输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将其分为[7,2,5] 和 [10,8],因为此时这两个子数组各自的和的最大值为18,在所有情况中原创 2020-07-25 10:33:23 · 609 阅读 · 0 评论 -
1025. 除数博弈(C++)---动态规划解题
题目详情爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。示例 1:输入:2输出:true解释:爱丽丝选择 1,鲍勃无法进行操作。示例 2.原创 2020-07-24 09:26:57 · 368 阅读 · 0 评论 -
64. 最小路径和(C++)---动态规划解题
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。——题目难度:中等分析大致思路和63. 不同路径 II(C++)---动态规划解题(并进行滚动数组思想优化)差不多。用dp[i][j]来表示 坐标(0,0) 到 坐标(i,j) 的数字总和。-代码如...原创 2020-07-23 20:10:22 · 544 阅读 · 1 评论 -
312. 戳气球(C++)---动态规划解题
题目详情有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得nums[left] * nums[i] * nums[right]个硬币。这里的left和right代表和i相邻的两个气球的序号。注意当你戳破了气球 i 后,气球left和气球right就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设nums[-1] = nums[n] = 1,但注意...原创 2020-07-19 14:05:23 · 729 阅读 · 0 评论 -
97. 交错字符串(C++)---动态规划解题 + 滚动数组优化
题目详情给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。示例 1:输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出: true示例 2:输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出: false——题目难度:困难分析解决这类字符串匹配的题目使用动态规划来解是个很好的选择。首先如果 s1串长度+ s2串长度 ..原创 2020-07-18 11:27:16 · 320 阅读 · 0 评论 -
96. 不同的二叉搜索树(C++)---动态规划解题
给定一个整数 n,求以1 ...n为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 ...原创 2020-07-15 10:58:15 · 275 阅读 · 0 评论 -
120. 三角形最小路径和(C++)---动态规划解题
题目详情给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为11(即,2+3+5+1= 11)。说明:如果你可以只使用 O(n)的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会...原创 2020-07-14 09:38:31 · 554 阅读 · 0 评论 -
174. 地下城游戏(C++)---动态规划(倒推)解题
题目详情一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑原创 2020-07-12 10:12:10 · 631 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期(C++)---动态规划解题(并进行空间优化)
题目详情给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]——题目难度:中等分析1.确定状态根据题目描述,可以设计..原创 2020-07-10 13:38:32 · 313 阅读 · 0 评论 -
面试题 17.13. 恢复空格(C++)---Tire(字典树) + 动态规划 解题
题目详情哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboot"。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相对原题稍作原创 2020-07-09 12:04:49 · 192 阅读 · 0 评论 -
62. 不同路径(C++)---动态规划解题(并进行滚动数组思想优化)
题目详情一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> 向下 -> 向右3.原创 2020-07-07 11:34:04 · 424 阅读 · 0 评论 -
63. 不同路径 II(C++)---动态规划解题(并进行滚动数组思想优化)
题目详情一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一...原创 2020-07-06 11:08:20 · 312 阅读 · 0 评论 -
32. 最长有效括号(C++)---动态规划解题(包含使用动态规划的思路)
题目详情给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"——题目难度:困难分析题目所说的 “最长的包含有效括号的子串” 的意思是该子串里不允许有 没有成为"(...)",也就是没有匹配的括号。使用动态规划解题一般有如下3个步骤:确定状态 - 研究最优策略的最后一步 .原创 2020-07-04 11:36:03 · 885 阅读 · 0 评论 -
718. 最长重复子数组(C++)---动态规划解题
题目详情给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释:长度最长的公共子数组是 [3, 2, 1]。说明:1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100——题目难度:中等分析用dp[i][j] 表示 长度为i,以A[i-1]为末尾 和 长度为j,以B[j-1]为末尾的 的 ..原创 2020-07-01 15:48:48 · 344 阅读 · 1 评论 -
P2426 删数(C++)---动态规划
题目描述有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数。操作价值为|xi – xk|*(k-i+1),如果只去掉一个数,操作价值为这个数的值。 问如何操作可以得到最大值,求操作的最大价值。输入格式第一行为一个正整数N;第二行有N个用空格隔开的N个不同的正整数。输出原创 2020-06-25 20:34:10 · 492 阅读 · 0 评论 -
55. 跳跃游戏(C++)---动态规划解题
题目详情给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。——题.原创 2020-06-25 10:35:44 · 560 阅读 · 0 评论 -
139. 单词拆分(C++)---动态规划解题
题目详情给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:输入: s = "applepenapple", wo.原创 2020-06-25 09:41:35 · 743 阅读 · 0 评论 -
10. 正则表达式匹配(C++)---动态规划解题
题目详情给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。 示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例 2:..原创 2020-06-20 20:52:09 · 315 阅读 · 0 评论 -
面试题46. 把数字翻译成字符串(C++)---动态规划解题
题目详情给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"提示:0 <= num < 2^31——题目难度:中等这道题用...原创 2020-06-09 16:17:33 · 355 阅读 · 0 评论 -
70. 爬楼梯(C++)---动态规划解题
题目详情假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶——题目难度:简单爬楼梯是每次爬一层或爬两层,那么总的...原创 2020-06-09 16:16:47 · 1595 阅读 · 0 评论 -
837. 新21点(C++)---动态规划解题
题目详情爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?示例 1:输入:N = 10, K = 1, W = 10输出:1.00000说明:爱丽丝得到一张卡,然后停止。示例 2:输入:.原创 2020-06-03 14:43:22 · 296 阅读 · 0 评论 -
5. 最长回文子串(C++)---动态规划解题
题目详情给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"——题目难度:中等思路用一个二维数组dp来记录字符串中从下标l到下标r的字串是否为回文子串,如果是则为dp[l][r]为true,否则为false。因为一个字符肯定是回文字串(dp[i][i]肯定为true),所以首先需要对dp数组进..原创 2020-05-21 09:26:26 · 546 阅读 · 0 评论 -
152. 乘积最大子数组(C++)---动态规划解题
题目详情给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。——题目难度:中等-下面代码class Solution {public: int maxProduct(vect...原创 2020-05-18 10:06:20 · 304 阅读 · 0 评论 -
983. 最低票价(C++)---动态规划解题
题目详情在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元; 一张为期七天的通行证售价为 costs[1] 美元; 一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限...原创 2020-05-06 09:09:53 · 527 阅读 · 0 评论 -
53. 最大子序和(C语言/C++)---动态规划
目录前言前言原创 2020-05-03 08:47:56 · 853 阅读 · 0 评论