
DP
AAS48
一起学算法
展开
-
Leet code1049 最后一块石头的重量II
我们可以将石头分成两堆,假设为堆 A 和堆 B。我们的目标是使得两堆石头的重量差最小。,我们有两种选择:选取它或者不选取它。个石头中选取一些石头,使得它们的总重量恰好为。个石头中选取一些石头,使得它们的总重量恰好为。个石头中选取一些石头,使得它们的总重量恰好为。个石头中选取一些石头,使得它们的总重量恰好为。假设石头的重量分别为。而这个也正是最后无法合并,剩下的石子重量。的前提下,尽可能地选取石头放入堆 A。1049 最后一块石头的重量II。最后,A堆的石子重量为:j。最后一块石头的重量为。原创 2023-08-13 15:09:58 · 290 阅读 · 0 评论 -
Leetcode 678. 有效的括号字符串
由于子串的长度为 len,所以起始位置的最大值为 n - len,以确保子串不会超出字符串的边界。我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从字符串的第 i 个字符到第 j 个字符(闭区间)是否为有效字符串。1、当 s[i] 和 s[j] 分别为 ‘(’ 和 ‘)’ 时,dp[i][j] 可以为有效字符串的条件是 dp[i+1][j-1] 为有效字符串。内部存在一个分割点k,使得 dp[i][k] && dp[k+1][j] 同时为有效的括号字符串。输入:s = “(*))”原创 2023-08-11 14:00:13 · 360 阅读 · 0 评论 -
Leetcode 583 两个字符串的删除操作(经典)
这个问题可以使用动态规划来解决。我们可以构建一个二维数组 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符变成 word2 的前 j 个字符所需的最小步数。最终,dp[word1.length()][word2.length()] 就是将整个 word1 变成 word2 所需的最小步数。给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的一个字符。原创 2023-08-11 11:43:20 · 364 阅读 · 0 评论 -
LCP 18. 早餐组合(dp背包思想优化)
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1。本题用暴力会超时,因为数据量是10的5次方。暴力是N^2的复杂度。如果这样的话,就可以省去一层循环了。因此我们需要一个O(n)的算法。原创 2022-10-07 14:19:49 · 136 阅读 · 0 评论 -
Leetcode 6189. 按位与最大的最长子数组(DP)
换句话说,令 k 是 nums 任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于 k 的子数组。考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。第i位的按位与最大值,要么是在前一位的基础上与运算,要么是自己本身。数组的按位与就是对数组中的所有数字进行按位与运算。给你一个长度为 n 的整数数组 nums。借助了动态规划:最长递增子数组的思想。返回满足要求的 最长 子数组的长度。子数组 是数组中的一个连续元素序列。原创 2022-09-25 12:32:20 · 261 阅读 · 0 评论 -
416. 分割等和子集(dp01背包,深刻理解动态规划)
给你一个 只包含正整数 的 非空 数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。因此,我们定义dp[i][val] 表示前i个物品,能否凑出重量为val的这种方案。如果dp[i][val] = 1表示可以凑出,等于0表示不能凑出。因为要求是分成两个等和子集,所以其实我们可以理解为,本题思路非常巧妙,将其转成01背包的动态规划。经过本题之后,确实感觉对动态规划更有感觉了。状态转移:基本上和01背包一样的思想。原创 2022-09-17 15:32:03 · 191 阅读 · 0 评论 -
1387. 将整数按权重排序(记忆化搜索)
你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。12 的权重为 9(12 --> 6 --> 3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)搜的过程中如果把6的结果记录下来,那么12就是在它的基础上加1即可。原创 2022-09-13 13:24:31 · 128 阅读 · 0 评论 -
Leetcode 1395. 统计作战单位数 (DP)
作战单位需满足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0原创 2022-09-10 14:05:23 · 111 阅读 · 0 评论 -
剑指 Offer II 092. 翻转字符(DP,详细分析)
如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。如果我这一位是1,想翻1串,那么两种情况:1、前面i-1位翻成1串,然后我不用动。如果想翻1串,那么有两种情况:第一种情况、前面i-1位翻成1串,然后我也翻一下:即dp[i-1].one + 1。原创 2022-09-09 18:07:23 · 239 阅读 · 0 评论 -
Leetcode 894. 所有可能的真二叉树(较难的DP,代码量大)
给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0。比如dp[7]的所有情况都是建立在dp[5]的基础上的。因为在所有n=5的子树下面找叶子节点挂两个节点,就变成n=7的一个解了。答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表。真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。但是思路其实不算很难,偶数时肯定没有,主要是奇数情况。所谓重复指的是,结构相同的树。原创 2022-09-08 19:25:34 · 236 阅读 · 0 评论 -
剑指 Offer II 091. 粉刷房子(巧妙的实现DP)
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。输入: costs = [[17,2,17],[16,16,5],[14,3,19]]解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。请计算出粉刷完所有房子最少的花费成本。原创 2022-09-08 17:31:44 · 168 阅读 · 0 评论 -
Leetcode 646. 最长数对链(简单DP)
现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。在每一个数对中,第一个数字总是比第二个数字小。解释:最长的数对链是 [1,2] -> [3,4]输入:[[1,2], [2,3], [3,4]]但是要注意,要先排序!所以结合了一点点贪心。这样递推式就非常简单了。原创 2022-09-03 12:33:58 · 151 阅读 · 0 评论 -
LCP 07. 传递信息(dp && js的二维数组)
共有 3 种方案,分别是 0->2->0->4, 0->2->1->4, 0->2->3->4。输入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3。dp[i][k] = Sum( dp[j][k - 1] ) (j = 所有 i 能直接去的节点)传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0。原创 2022-08-22 21:54:50 · 103 阅读 · 0 评论 -
Leetcode 打家劫舍系列
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4。...原创 2022-08-13 23:12:15 · 138 阅读 · 0 评论 -
Leetcode 最长上升子序列 (经典动态规划)
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。解释:最长递增子序列是 [2,3,7,101],因此长度为 4。给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。输入:nums = [10,9,2,5,3,7,101,18]输入:nums = [7,7,7,7,7,7,7]输入:nums = [0,1,0,3,2,3]...原创 2022-08-13 18:12:54 · 201 阅读 · 0 评论 -
Leetcode 完全平方数
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。先写出递归版本,发现有大量重复子问题。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。解释:12 = 4 + 4 + 4。解释:13 = 4 + 9。...原创 2022-08-13 17:56:48 · 251 阅读 · 0 评论 -
LeetCode 120. 三角形最小路径和(经典数字三角形dp)
【问题描述】给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。【思路】经典的数字三角形,...原创 2019-02-27 17:33:33 · 380 阅读 · 0 评论 -
LeetCode: 516. 最长回文子序列(DP,思路清奇)
【问题描述】给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。示例 1:输入:“bbbab”输出:4一个可能的最长回文子序列为 “bbbb”。示例 2:输入:“cbbd”输出:2一个可能的最长回文子序列为 “bb”。【思路】我一开始完全是按照最长递增子序列的思路来的,唯一的区别就是维护了一个start数组来存放每个回文序列的起始字符下标位置。...原创 2019-03-07 16:24:35 · 324 阅读 · 0 评论 -
蓝桥杯:历届试题 包子凑数(dp打表 + 最大公约数)
历届试题 包子凑数时间限制:1.0s 内存限制:256.0MB问题描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就...原创 2019-03-17 14:33:53 · 452 阅读 · 0 评论 -
蓝桥杯习题:历届试题 买不到的数目(dp打表)
历届试题 买不到的数目时间限制:1.0s 内存限制:256.0MB问题描述小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是...原创 2019-03-17 14:52:30 · 367 阅读 · 0 评论 -
LeetCode:343. 整数拆分(DP)
整数拆分。给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。【思路】通过前几题训练之...原创 2019-03-17 15:19:59 · 403 阅读 · 0 评论 -
LeetCode: 279. 完全平方数(递归思想,DP解决)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.【思路】dp题其实就是递归题,我其实很讨厌说动态规划这个名词,因为给人一种很晦涩难懂的感觉。动规的...原创 2019-03-13 13:19:10 · 1080 阅读 · 0 评论 -
LeetCode: 392. 判断子序列(DP)
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = “...原创 2019-03-13 16:05:27 · 319 阅读 · 0 评论 -
用LeetCode例题来理解动态规划思想
【前言】:一直以来,动态规划算法(dp)对很多人来说都是非常非常难的存在。记得大一做算法题的时候,动态规划就很难理解,看了别人的代码也难理解,因为很多大牛dp代码都写得相当精炼。这几天读了几篇很好的算法文章,并且刷了一些LeetCode中的dp题,感觉对dp思想的理解更加深入了,因此写下一篇博客分享。在这篇文章中,我主要以例题的形式解释dp思想,内容通俗,避开枯燥的概念和数学推导,希望能便于理解...原创 2019-08-11 12:22:44 · 257 阅读 · 0 评论 -
LeetCode: 740. 删除与获得点数(DP,想法很神奇)
【问题描述】给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入: nums = [3, 4, 2]输出: 6解释:删除 4 来获得 4 个...原创 2019-03-07 14:49:29 · 309 阅读 · 0 评论 -
LeetCode: 377. 组合总和 Ⅳ(DP)
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。示例:nums = [1, 2, 3]target = 4所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。因此输出为 7。【思路】本题自己其实已经快要想出来,都已经想...原创 2019-03-14 18:19:40 · 261 阅读 · 0 评论 -
LeetCode: 647. 回文子串(区间DP)
【问题描述】给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: “abc”输出: 3解释: 三个回文子串: “a”, “b”, “c”.示例 2:输入: “aaa”输出: 6说明: 6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”.注意:...原创 2019-03-07 12:57:28 · 436 阅读 · 0 评论 -
HDU 2571 命运(DP迷宫问题拓展)
原题链接:hdu 2571 命运本题也是属于经典的dp问题,迷宫问题。原问题应该是,迷宫每个格子里有一个数值,每次只能往右或者往下走一格,求从左上角走到右下角能获得的最大值。如果是这样,那么状态转移方程很简单,dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);但本题做了些变化,即每次我可以往右或往下移动一格,我还可以走到该行的列数是当前所在列数倍数的格子。...原创 2019-02-13 13:15:31 · 454 阅读 · 0 评论 -
HDU 2132 An easy problem(简单DP)
Problem DescriptionWe once did a lot of recursional problem . I think some of them is easy for you and some if hard for you.Now there is a very easy problem . I think you can AC it.We can define su...原创 2019-02-18 16:14:02 · 247 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!(DP,最大递增子序列和)
Problem DescriptionNowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this game, so I introduce it to you...原创 2019-02-12 15:25:13 · 464 阅读 · 0 评论 -
DP练习题:求解相邻比特数问题(偏难的DP)
【问题描述】一个n位的01字符串x = x1x2…xn,其相邻比特数由函数:fun(x) = x1x2 + x2x3 + … + xn - 1xn 计算出来,它计算两个相邻的1出现的次数。比如:fun(011101101) = 3fun(111101101) = 4fun(010101010) = 0编写程序以n和p作为输入,求出长度为n的满足fun(x) = p的x的个数。例如,n ...原创 2019-02-23 00:35:47 · 2572 阅读 · 3 评论 -
LeetCode 712. 两个字符串的最小ASCII删除和(DP,类似最短编辑距离问题)
【问题描述】给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和。示例 1:输入: s1 = “sea”, s2 = “eat”输出: 231解释: 在 “sea” 中删除 “s” 并将 “s” 的值(115)加入总和。在 “eat” 中删除 “t” 并将 116 加入总和。结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。...原创 2019-02-27 18:34:59 · 350 阅读 · 0 评论 -
LeetCode 877. 石子游戏(区间dp)
【题目描述】:亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 tr...原创 2019-02-27 16:50:30 · 507 阅读 · 1 评论 -
HDU 1203 I NEED A OFFER!(DP, 01背包问题滚动数组优化)
Problem DescriptionSpeakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了。要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的。Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他得到...原创 2019-02-16 12:58:32 · 222 阅读 · 0 评论 -
经典DP问题系列之五:求解编辑距离问题
【问题描述】设A,B是两个字符串,现在要用最少的字符操作次数将字符串A转换成字符串B。这里所说的字符操作共有以下三种:1.删除一个字符2.插入一个字符3.将一个字符修改为另一个字符例如将A = “sfdqxbw” 转换成 “gfdgw”需要四次操作。【思路】比如一个字符串是A1…Am一个字符串是B1…Bn那么有两种情况:1.Am != Bn; 2.Am == Bn我们设dp[i...原创 2019-02-21 17:00:23 · 560 阅读 · 0 评论 -
HDU 1003 MAX SUM(DP,最大连续子序列和+路径存储)
Problem DescriptionGiven a sequence a[1],a[2],a[3]…a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 1...原创 2019-02-13 14:41:21 · 195 阅读 · 0 评论 -
DP练习题:求解幸运数问题(递归思想,动规解决)
【问题描述】小明同学学习了不同的进制之后,拿起了一些数字做起了游戏。小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中,二进制数也很常用。现在对于一个数字x,小明同学定义出了两个函数f(x)和g(x)。 f(x)表示把x这个数用十进制写出后各个数位上的数字之和。如f(123)=1+2+3=6。 g(x)表示把x这个数用二进制写出后各个数位上的数字之和。如123的二进制表示为11110...原创 2019-02-28 15:44:03 · 3006 阅读 · 1 评论 -
天梯赛习题:L3-001 凑零钱(DP,01背包变种)
L3-001 凑零钱 (30 分)韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 104 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。输入格式:输入第一行给出两个正整数:N(≤104 )是硬币的总个数,M(≤102 )是韩梅梅要付的...原创 2019-03-09 19:12:27 · 4205 阅读 · 2 评论 -
DP练习题:最大括号匹配问题(区间DP)
【题目描述】给定一个括号字符串,让你求出最大括号匹配的括号数【思路】dp[i][j]表示区间i到j中的最大括号匹配数,分析发现,它与小区间的括号问题是相关联的,具有最优子结构性质。这是一个区间dp问题。比如:假定我们求()))()这个括号串的最大括号匹配数,即f(0, 5)的结果显然,f(0, 5) = f(0, 1) + f(1, 5)f(0, 5) = f(0, 2) + f(2,...原创 2019-02-27 11:32:44 · 821 阅读 · 0 评论 -
DP训练:最长对称子串(回文串,区间dp)
L2-008 最长对称子串 (25 分)对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&amp;TAP symmetric?,最长对称子串为s PAT&amp;TAP s,于是你应该输出11。输入格式:输入在一行中给出长度不超过1000的非空字符串。输出格式:在一行中输出最长对称子串的长度。输入样例:Is PAT&amp;TAP symmetric?输出样...原创 2019-03-02 16:01:45 · 316 阅读 · 0 评论