
动态规划
hestyle
戎码一生!
展开
-
LeetCode 盈利计划(动态规划)
让我们把这些犯罪的任何子集称为盈利计划,该计划至少产生 P 的利润。有多少种方案可以选择?因为答案很大,所以返回它模 10^9 + 7 的值。示例 1:输入:G = 5, P = 3, group = [2,2], profit = [2,3]输出:2解释: 至少产生 3 的利润,该帮派可以犯下罪 0 和罪 1 ,或仅犯下罪 1 。总的来说,有两种方案。示例 2:输入:G = ...原创 2019-06-12 11:38:31 · 825 阅读 · 0 评论 -
LeetCode 删除与获得点数(动态规划+hash表)
给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入: nums = [3, 4, 2]输出: 6解释: 删除 4 来获得 4 个点数,因此 ...原创 2019-05-02 15:42:03 · 385 阅读 · 0 评论 -
LeetCode 奇怪的打印机(动态规划)
有台奇怪的打印机有以下两个特殊要求:打印机每次只能打印同一个字符序列。每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。给定一个只包含小写英文字母的字符串,你的任务是计算这个打印机打印它需要的最少次数。示例 1:输入: "aaabbb"输出: 2解释: 首先打印 "aaa" 然后打印 "bbb"。示例 2:输入: "aba"输出: 2解释: 首先打印 "a...原创 2019-04-18 17:00:50 · 2015 阅读 · 3 评论 -
LeetCode 最长重复子数组(动态规划)
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释: 长度最长的公共子数组是 [3, 2, 1]。说明:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100思路分析: 这显然是一道动态规划的题,...原创 2019-04-27 15:33:05 · 1628 阅读 · 0 评论 -
LeetCode "马"在棋盘上的概率(动态规划、记忆搜索)
已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。现在 “马” 每一步都从可选...原创 2019-04-23 09:24:18 · 1969 阅读 · 1 评论 -
LeetCode 买卖股票的最佳时机含手续费(动态规划)
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能够达到的最大利...原创 2019-04-27 10:20:58 · 670 阅读 · 0 评论 -
LeetCode 只有两个键的键盘(动态规划)
最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。Paste (粘贴) : 你可以粘贴你上一次复制的字符。给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 ‘A’。输出能够打印出 n 个 ‘A’ 的最少操作次数。示例 1:输入: 3输出: ...原创 2019-04-18 08:50:00 · 763 阅读 · 0 评论 -
LeetCode 两个字符串的最小ASCII删除和(动态规划)
给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和。示例 1:输入: s1 = "sea", s2 = "eat"输出: 231解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。在 "eat" 中删除 "t" 并将 116 加入总和。结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。示例 2:...原创 2019-04-26 21:00:21 · 887 阅读 · 0 评论 -
LeetCode 回文子串(动态规划、中心扩展法)
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".注意:输入的字...原创 2019-04-17 15:31:36 · 743 阅读 · 0 评论 -
LeetCode 摘樱桃(动态规划)
一个N x N的网格(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示:0 表示这个格子是空的,所以你可以穿过它。1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。-1 表示这个格子里有荆棘,挡着你的路。你的任务是在遵守下列规则的情况下,尽可能的摘到最多樱桃:从位置 (0, 0) 出发,最后到达 (N-1, N-1) ,只能向下或向右走,并且只能穿越有效的格子...原创 2019-05-02 19:14:58 · 3596 阅读 · 1 评论 -
LeetCode 最长递增子序列的个数(动态规划)
给定一个未排序的整数数组,找到最长递增子序列的个数。示例 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...原创 2019-04-19 17:59:05 · 1205 阅读 · 0 评论 -
LeetCode 统计不同回文子字符串(动态规划)
给定一个字符串 S,找出 S 中不同的非空回文子序列个数,并返回该数字与 10^9 + 7 的模。通过从 S 中删除 0 个或多个字符来获得子字符序列。如果一个字符序列与它反转后的字符序列一致,那么它是回文字符序列。如果对于某个 i,A_i != B_i,那么 A_1, A_2, … 和 B_1, B_2, … 这两个字符序列是不同的。示例 1:输入:S = 'bccb'输出:6...原创 2019-04-30 15:10:44 · 1610 阅读 · 0 评论 -
LeetCode 石子游戏(动态规划)
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得...原创 2019-06-11 15:41:18 · 2186 阅读 · 0 评论 -
LeetCode 最长的斐波拉契子序列的长度(hash表+动态规划)
如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不...原创 2019-06-10 18:24:41 · 596 阅读 · 0 评论 -
LeetCode DI序列的有效排列(分治+动态规划)
我们给出 S,一个源于 {‘D’, ‘I’} 的长度为 n 的字符串 。(这些字母代表 “减少” 和 “增加”。)有效排列 是对整数 {0, 1, …, n} 的一个排列 P[0], P[1], …, P[n],使得对所有的 i:如果 S[i] == ‘D’,那么 P[i] > P[i+1],以及;如果 S[i] == ‘I’,那么 P[i] < P[i+1]。有多少个有效排列...原创 2019-06-19 15:27:17 · 7746 阅读 · 2 评论 -
LeetCode 新21点
爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?示例 1:输入:N = 10, K = 1, ...原创 2019-05-28 20:23:29 · 695 阅读 · 0 评论 -
LeetCode 带因子的二叉树(动态规划)
给出一个含有不重复整数元素的数组,每个整数均大于 1。我们用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。满足条件的二叉树一共有多少个?返回的结果应模除 10 ** 9 + 7。示例 1:输入: A = [2, 4]输出: 3解释: 我们可以得到这些二叉树: [2], [4], [4, 2, 2]示例 2:输入: A = ...原创 2019-05-22 18:47:25 · 379 阅读 · 0 评论 -
LeetCode K站中转内最便宜的航班(回溯法、动态规划)
有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。示例 1:输入: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]src = 0, ...原创 2019-05-12 11:08:01 · 3773 阅读 · 2 评论 -
LeetCode 使序列递增的最小交换(动态规划)
我们有两个长度相等且不为空的整型数组 A 和 B 。我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < … < A[A.length - 1])。给定数组 A 和 B ,请返回使得两个数组均保持严格递增状...原创 2019-05-16 15:34:03 · 1823 阅读 · 0 评论 -
LeetCode 最大平均值和的分组(动态规划)
我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。示例:输入: A = [9,1,2,3,9]K = 3输出: 20解释: A 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) ...原创 2019-05-19 10:45:07 · 2303 阅读 · 4 评论 -
LeetCode 最长数对链(动态规划)
给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。示例 :输入: [[1,2], [2,3], [3,4]]输出: ...原创 2019-04-17 14:51:38 · 366 阅读 · 0 评论 -
LeetCode 解码方法(动态规划)
一条包含字母 A-Z 的消息通过以下的方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26除了上述的条件以外,现在加密字符串可以包含字符 '‘了,字符’‘可以被当做1到9当中的任意一个数字。给定一条包含数字和字符’*'的加密信息,请确定解码方法的总数。同时,由于结果值可能会相当的大,所以你应当对109 + 7取模。(翻译者标注:此处取模主要是为了防止...原创 2019-04-17 10:48:33 · 982 阅读 · 1 评论 -
LeetCode 两个字符串的删除操作(动态规划)
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。示例 1:输入: "sea", "eat"输出: 2解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"说明:给定单词的长度不超过500。给定单词中的字符只含有小写字母。思路分析: 这是典型的字符串操作最优题,一般动态规划...原创 2019-04-14 10:06:30 · 1705 阅读 · 0 评论 -
LeetCode 最小路径和(动态规划+图解)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。思路分析:因为图上只有下移、右移两种移动方式,那么到达dp[row][col]只可能从dp[row ...原创 2019-02-14 09:59:10 · 1806 阅读 · 0 评论 -
LeetCode 不同路径(动态规划)
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2...原创 2019-02-13 22:15:04 · 350 阅读 · 0 评论 -
LeetCode 最大子序和(动态规划)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。思路分析:这题太经典了,这种最大子序问题,比较常见、高效的解题方法是动...原创 2019-02-09 21:15:39 · 252 阅读 · 0 评论 -
LeetCode 目标和(深度优先搜索+动态规划)
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例 1:输入: nums: [1, 1, 1, 1, 1], S: 3输出: 5解释: -1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+...原创 2019-04-05 15:23:41 · 1770 阅读 · 0 评论 -
LeetCode 预测赢家(动态规划)
给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。示例 1:输入: [1, 5, 2]输出: Fa...原创 2019-04-04 20:45:04 · 1851 阅读 · 0 评论 -
LeetCode 连接词(动态规划+前缀树)
给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词。连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的。示例:输入: ["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"]输出: ["catsdogcats","dogcatsdog","r...原创 2019-03-31 11:58:26 · 958 阅读 · 5 评论 -
LeetCode 环绕字符串中唯一的子字符串(动态规划+hash表)
把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…".现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同...原创 2019-03-30 17:11:12 · 693 阅读 · 0 评论 -
LeetCode 正则表达式的匹配
给定一个字符串 (s) 和一个字符模式 §。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符。‘*’ 匹配零个或多个前面的元素。匹配应该覆盖整个字符串 (s) ,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1: 输入: s = "aa" p = "a" ...原创 2019-02-09 11:03:26 · 474 阅读 · 0 评论 -
LeetCode 爬楼梯(动态规划)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶思路...原创 2019-02-14 16:01:11 · 318 阅读 · 0 评论 -
LeetCode 编辑距离(动态规划)
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -&gt; rorse (将 'h' 替换为 'r') rorse -&gt; rose (...原创 2019-02-14 19:55:00 · 466 阅读 · 0 评论 -
LeetCode 自由之路(动态规划、回溯法)
视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 ...原创 2019-04-06 18:49:02 · 743 阅读 · 0 评论 -
LeetCode 出界的路径数(动态规划)
给定一个 m × n 的网格和一个球。球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上、下、左、右四个方向上移动使球穿过网格边界。但是,你最多可以移动 N 次。找出可以将球移出边界的路径数量。答案可能非常大,返回 结果 mod 109 + 7 的值。示例 1:输入: m = 2, n = 2, N = 2, i = 0, j = 0输出: 6解释:示例 2:输入...原创 2019-04-13 15:49:40 · 639 阅读 · 0 评论 -
LeetCode K个逆序对数组(动态规划)
给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 a[i] > a[j],则其为一个逆序对;否则不是。由于答案可能很大,只需要返回 答案 mod 109 + 7 的值。示例 1:输入: n = 3, k = 0输出: 1解释: 只有数组 [1,2,...原创 2019-04-16 15:05:44 · 1163 阅读 · 0 评论 -
LeetCode 学生出勤记录II(动态规划)
给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量。 答案可能非常大,你只需返回结果mod 109 + 7的值。学生出勤记录是只包含以下三个字符的字符串:'A' : Absent,缺勤'L' : Late,迟到'P' : Present,到场如果记录不包含多于一个’A’(缺勤)或超过两个连续的’L’(迟到),则该记录被视为可奖励的。示例 1:输入: n = 2...转载 2019-04-11 21:08:41 · 929 阅读 · 0 评论 -
LeetCode 移除盒子(深度优先搜索、动态规划)
给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。当你将所有盒子都去掉之后,求你能获得的最大积分和。示例 1:输入:[1, 3, 2, 2, 2, 3, 4, 3, 1]输出:23解释:[1, ...原创 2019-04-11 17:00:09 · 1743 阅读 · 0 评论 -
LeetCode 一和零(动态规划)
在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。注意:给定 0 和 1 的数量都不会超过 100。给定字符串数组的长度不会超过 600。示例 1:输入...原创 2019-04-02 09:31:25 · 1206 阅读 · 0 评论 -
LeetCode 零钱兑换II(动态规划)
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amount = 3, coins = [2]输出: 0解释: 只用面额...原创 2019-04-07 11:17:33 · 2129 阅读 · 0 评论