LC 贪心、动态规划与记忆化搜索
文章平均质量分 64
Leetcode与Lintcode 贪心、动态规划与记忆化搜索
记录算法题解
算法与数学
展开
-
【Leetcode】808. Soup Servings
的相等概率从四种操作中选择一种。如果剩余的汤量不足以完成操作,将全部提供。一旦汤不够了就停止。的A型和B型同时用完的概率。然后用全概率公式进行记忆化搜索。的A型和B型同时用完的概率。毫升的每种类型的汤。型汤首先用完的概率,加上。范围内的答案都可以接受。型汤首先用完的概率,加上。,实际时间不会这么多。思路是记忆化搜索,令。原创 2024-01-16 15:39:43 · 352 阅读 · 0 评论 -
【Leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
个不重合子区间的情况下的最大总和(递推从后向前递推,那么求方案的时候就能从前向后求字典序最小的方案)。那么全局最大总和就是。个区间的总和最大,问方案,只需给出每个区间的起点下标即可。如果方案不唯一,则返回字典序最小的那个方案。的不重合的区间,使得这。开始,先求前缀和数组。原创 2024-01-14 13:07:12 · 792 阅读 · 0 评论 -
【Leetcode】691. Stickers to Spell Word
的填充状态看成一个二进制数,然后DFS,每一层枚举当前要选哪个字符串进行填充。为了避免重复,我们开两个数组。个不同字符串若干个,允许重复选,使得选出的字符串的字母构成的多重集可以覆盖。填充一个字符串等价于填充其所有所含字母。个不同的字符串,以数组形式给出,再给定一个字符串。问需要多少个字符串。之后形成的新状态是什么(有可能。填满(填满对应的状态就是。的字符已经填充完毕,或者。时间复杂度指数级,空间。原创 2024-01-05 14:18:38 · 325 阅读 · 0 评论 -
【Leetcode】1289. Minimum Falling Path Sum II
求数值总和最小的下降路径的总和,要求每一步下降都不能是竖直的下降。的最小值和次小值即可。原创 2023-12-06 12:00:13 · 103 阅读 · 0 评论 -
【Leetcode】1278. Palindrome Partitioning III
个非空子串,至少修改多少个字符能使得每一部分都成为回文串,那么可以按照最后一段是哪一段来分类,如果最后一段长度是。个子串都变成回文串。问被修改的位置的个数的最小值。个非空子串,每个子串修改若干个字符使得这。,那么此时最少修改次数就是。修改多少次可以成为回文串。原创 2023-12-01 14:18:01 · 37 阅读 · 0 评论 -
【Leetcode】1269. Number of Ways to Stay in the Same Place After Some Steps
的位置,每一步可以向左、向右或者不动,问。的数组,有个指针位于。原创 2023-11-28 14:37:07 · 41 阅读 · 0 评论 -
【Leetcode】2318. Number of Distinct Roll Sequences
次形成一个序列,要求相邻的点数互质,并且某个点数不能和前两次相同。原创 2023-11-02 03:38:27 · 31 阅读 · 0 评论 -
【Leetcode】1626. Best Team With No Conflicts
个球员,每个球员有两个属性,分数和年龄,都是正整数。现在要挑选若干球员得到一个球队,使得他们的总分最大,但要求不能有两个球员是矛盾的,矛盾的定义是球员。,第二种是,它前面还有别的数字,那么前面那些数字也是个非降子序列,可以枚举倒数第二个数,以那个倒数第二个数为结尾的非降子序列的最大和可以直接查。先将所有球员按年龄从小到大排序,如果年龄相等则按分数从小到大排序,我们看排序后的分数数组。里任意一个非降子序列,都是一个合法的球队;的最大和的非降子序列的和,可以用动态规划来做。结尾的和最大的非降子序列的和,那么。原创 2023-11-01 15:10:04 · 93 阅读 · 0 评论 -
【Leetcode】1687. Delivering Boxes from Storage to Ports
现在卡车需要按照货箱在数组中的顺序依次将所有货箱运到相应的码头。运送方式是,卡车先依次装上货箱,然后将这些货箱按照货箱在数组中的顺序,依次前往对应的码头,最后再返回仓库继续运下一批货。从仓库到某个码头,或者从码头到另一个不同的码头,或者从码头到仓库,每一段的代价都是。,并且这个区间只会整体向右移动而不会左移,那么这个问题就变为了滑动窗口求最小值的问题,可以用单调队列。的货物,同时要保证货物个数不超过限制,总重量也不超过限制。表示这个货箱要去的码头的编号(编号从。这一段的码头编号的变化的次数之和再加。原创 2023-10-30 08:32:45 · 45 阅读 · 0 评论 -
【Leetcode】1105. Filling Bookcase Shelves
并且书要按照下标的次序依次放,即下标相邻的书要紧挨着(当然如果不在同一书架上的话可以不挨着)。问最小的总高度是多少。每个书架的高度定义为其最高的书的高度。本书所在的那一个书架有多少本书来分类。其可以单独成为一段,也可以和之前的若干书成为一段。的宽度,同一个书架上的书的总宽度不能超过。我们将书竖直放在书架上,每本书占用。本书的情况下,最小的总高度。本书,每本书有其厚度和高度。原创 2023-10-16 15:23:26 · 34 阅读 · 0 评论 -
【Leetcode】1090. Largest Values From Labels(配数学证明)
组点,这样我们用一个竖直的扫描线从数轴大的数向小的数的方向扫过去,如果扫到某个数的时候,扫描线穿过的所有分组的物品都能选,显然这些物品都加进去是最优解;直接按照价值从大到小对物品排序,然后遍历物品,依次看当前物品能不能加入,能加入就加。想象一下我们先将所有的物品按标签分组,每个标签内部再按价值从大到小排列,假设有。表示同一个标签能选择的最多物品数。的个数,显然我们选哪个分组的物品是等效的。我们想象每个分组中的价值就是数轴上的点,然后有。个物品,每个物品有两个属性分别是其价值。表示总共最多能选择的物品数,原创 2023-10-16 06:23:53 · 28 阅读 · 0 评论 -
【Leetcode】1494. Parallel Courses II
门课,并且每学期上的课里必须每一门的前置课程都已经修好(当然没有前置课程也可以)。问最少多少个学期可以将所有课都上完。题目保证课程不会产生环。下可以上哪些还没上过的课,设这些课的二进制表示为。每门课可能有多门前置课程。,那么这些课是可以在下个学期里上完的,从而。,两个课程之间可能有前置关系,例如。的情况下,最少需要多少个学期。是要上完课程的二进制表示是。的所有非空子集,如果某子集。的一门前置课程,想上。原创 2023-09-25 11:36:49 · 95 阅读 · 0 评论 -
【Leetcode】2472. Maximum Number of Non-overlapping Palindrome Substrings
的情况即可(即奇回文和偶回文两种可能)。因为如果再长的话,之前一定是取到了最大值的。,从而可以枚举最后一个子串的起始位置。但是其实只需要看最后个子串长度。个字符最多能找到多少个不重合的回文子串且每个子串长度大于等于。属于最优方案的子串,那么由于最后一个子串长度大于等于。问所有选法里子串个数的最大值。中选取若干不重合子串,使得每个子串长度大于等于。不属于最优方案的子串,此时。先预处理一个bool数组。原创 2023-06-14 12:28:26 · 49 阅读 · 0 评论 -
【Leetcode】712. Minimum ASCII Delete Sum for Two Strings
可以删除任一字符串的任意多个字符,总代价为删除的字符的ASCII码总和。求让它们变得相等的最小总代价。个字符的前缀要变得相等,操作的最小总代价。如果都删,则最小总代价为。,那么不删也是一种选择,最小总代价为。四个情况取最小即可。是否做删除来分类,如果删。原创 2023-01-30 10:39:42 · 296 阅读 · 0 评论 -
【Leetcode】879. Profitable Schemes
和若干个任务,每个任务有人数和利润两个属性。问挑哪些任务可以使得总人数小于等于。个任务需要的人数),并且总利润要大于等于。个任务选不选来分类,如果不选,方案数为。如果选,则剩余的任务要人数小于等于。两个加起来即为总方案数。个任务的情况下,人数小于等于。个人,再给定一个最低利润。求任务的挑选方案数。,则所有方案可以按照第。个任务的利润),如果。原创 2023-01-08 09:43:40 · 204 阅读 · 0 评论 -
【Leetcode】813. Largest Sum of Averages
个非空段,并求每一段的平均值之后求和。段的情况下,能得到的平均数和的最大值。所在的段的左端点来分类,这个左端点可以取。直接枚举左端点即可。原创 2023-01-07 08:04:15 · 136 阅读 · 0 评论 -
【Leetcode】2272. Substring With Largest Variance
求一个子串,其某两个字符的频率之差达到最大,问这个最大频率差是多少。题目保证只含英文小写字母。则问题变为,求最大子数组和,并且要求子数组必须含。结尾的最大子数组和(可以含也可以不含。,所以前面的部分可以含也可以不含。当然也可以没有前面部分),映射为一个int数组,如果。初始条件,对于空串,原创 2023-01-06 03:56:40 · 268 阅读 · 0 评论 -
【Leetcode】629. K Inverse Pairs Array
个逆序对的排列个数。那么可以按照最后一个数字产生的逆序对个数分类,其可以产生。的某一段的和,可以用一个变量来跟踪这一段的和。原创 2023-01-02 14:03:02 · 145 阅读 · 0 评论 -
【Leetcode】943. Find the Shortest Superstring
是已经选择的单词的所有下标的集合的二进制压缩(显然同一个单词不会选择超过。的前缀的最长重合的长度(这个长度我们要预处理一下)。中单词各不相同,并且没有一个单词是另一个单词的子串。可以递推出什么样的状态,递推的前提是。次,这样没有意义)。里每个单词都是其子串。),那么长度的增加值实际上是。结尾的情况下所能得到的最短。是已经选择的单词的状态为。再由这个答案倒过来推出。,每个单词长度不超过。为单词最长长度,空间。原创 2023-01-01 03:02:14 · 160 阅读 · 0 评论 -
【Leetcode】790. Domino and Tromino Tiling
问要铺满矩阵,一共有多少不同的方案。考虑状态转移然后递推一遍即可。列的形状的二进制压缩,即。原创 2022-12-30 13:32:40 · 87 阅读 · 0 评论 -
【Leetcode】1884. Egg Drop With 2 Eggs and N Floors
在该楼层扔鸡蛋不会碎,但在其上面的楼层扔鸡蛋则会碎。同一个鸡蛋如果不碎,可以扔多次。问最少扔多少次能确定。层开始依次增大楼层扔,一旦发现碎了,那答案就是碎了的那一层编号减。层扔的,分两种情况,如果碎了,那么接下来至少需要扔。如果没碎,则还是有两个鸡蛋,但是楼层的范围缩小为。层楼的情况下,最少扔多少次能确定。次的情况下,能确定求出临界点。,那唯一的办法就是从第。个鸡蛋扔的楼层,如果第。给定两个鸡蛋,再给定。层高的楼,每一层编号。的大楼的最多层数,则。原创 2022-12-27 22:46:31 · 123 阅读 · 0 评论 -
【Leetcode】823. Binary Trees With Factors
要求以这些数字构成若干非空二叉树,每个非叶子的节点的值应当是其左右孩子的值的乘积(规定非叶子节点必须有两个孩子),问能构成多少个二叉树。每个值可以用无限次。为树根的情况下能构成多少个不同的二叉树,那么其所有后代的值必然都是。为树根的二叉树方案数的乘积。最后求一下总和即可。之前的值,从而可以枚举其左孩子的值,如果左孩子是。中存在,则这种方案存在,方案数即为以。的数字各不相同的数组。原创 2022-12-12 03:24:01 · 296 阅读 · 0 评论 -
【Leetcode】801. Minimum Swaps To Make Sequences Increasing
https://leetcode.com/problems/minimum-swaps-to-make-sequences-increasing/description/给定两个长nnn数组AAA和BBB,保证n≥2n\ge 2n≥2。每一次可以选择某个位置iii,让A[i]A[i]A[i]和B[i]B[i]B[i]交换位置。问至少换几次可以使得两个数组都严格单调增。题目保证解一定存在。参考https://blog.csdn.net/qq_46105170/article/details/113777285原创 2022-12-04 04:02:51 · 120 阅读 · 0 评论 -
【Leetcode】2100. Find Good Days to Rob the Bank
https://leetcode.com/problems/find-good-days-to-rob-the-bank/description/给定一个长nnn数组AAA,再给定一个非负整数ttt,求所有的满足下面条件的下标iii:A[i−t]≥A[i−t+1]≥...≥A[i]≤A[i+1]≤...≤A[i+t]A[i-t]\ge A[i-t+1]\ge ...\ge A[i]\le A[i+1]\le ...\le A[i+t]A[i−t]≥A[i−t+1]≥...≥A[i]≤A[i+1]≤...≤A原创 2022-12-04 03:45:54 · 410 阅读 · 0 评论 -
【Leetcode】1682. Longest Palindromic Subsequence II
求其长度为偶数的最长回文子序列,要求除了正中间两个字母相等以外,其余位置相邻字母都不相等。原创 2022-11-30 14:47:46 · 377 阅读 · 0 评论 -
【Leetcode】446. Arithmetic Slices II - Subsequence
那么我们可以枚举等差子序列的最后两个数,当枚举到。的等差子序列的个数,长度允许等于。统计答案的时候只需要将长度为。的等差子序列删掉即可。这一个子序列,也包括了前面接上。,这种子序列的个数包括了。的子序列,从而我们要将。的等差子序列的个数。原创 2022-11-27 09:57:09 · 406 阅读 · 0 评论 -
【Leetcode】664. Strange Printer(配数学证明)
去个重,即如果相邻位置字符相等,可以缩成一个,因为无论是什么方案,刷任意其中一个字符,都可以延伸着刷整个相同的一段。的操作提前为第一次操作,这样显然所得方案的总操作次数不差于原来的方案。的白板,可以每次将任意位置开始的任意长度的段刷成同一个字符,先刷的会被后刷的覆盖。的方案,从而我们只需要枚举这种类型的方案即可。即使第一步刷了,之后也会覆盖,所以可以第一步刷。的方案来说,这种方案都可以对应。,操作数也一样),同理,如果。的最优方案,它也可以转化为刷。的方案都可以转化为第一步刷。的那一次,假设这次刷的是。原创 2022-11-27 09:33:32 · 371 阅读 · 0 评论 -
【Leetcode】294. Flip Game II
思路是记忆化搜索,如果某个局面是乙的必败态,则当前局面是甲的必胜态。直接枚举第一步操作即可。可以用记忆化加速,避免重复计算。,谁无法操作了谁就输。,甲和乙轮流操作,每个人可以将。原创 2022-11-27 06:40:06 · 125 阅读 · 0 评论 -
【Leetcode】1027. Longest Arithmetic Subsequence
为最后两项的情况下的最长等差子序列的长度,那么。出现的最后位置,可以开一个哈希表。,求其最长等差子序列的长度。出现的最后的位置,比如说在。原创 2022-11-24 09:11:55 · 293 阅读 · 0 评论 -
【Leetcode】1444. Number of Ways of Cutting a Pizza
可以直接枚举第一刀是怎么切的,然后递归处理即可。为了快速判断某个子矩阵是否含。每次可以横着切一刀或者竖着切一刀,要求切出的那一块必须含。,我们可以用一个前缀和数组预处理一下。这一部分的不同切分方式。问有多少种不同的切分方式。原创 2022-11-24 07:11:19 · 450 阅读 · 0 评论 -
【Leetcode】2422. Merge Operations to Turn Array Into a Palindrome
那么我们必须先在两端凑出相等的和,否则无法回文。而凑出相等的和,可以用双指针来做。凑出相等的和之后,问题就转为了规模更小的问题了,从而得以解决。,那么最优方案一定不会去合并头尾两个数(如果合并,则两端都要参与合并,和都不参与合并是等价的,也可以得最优解)。,每一步允许将某一段整个替换为这一段的和。变为回文至少需要多少步。原创 2022-11-21 14:06:34 · 192 阅读 · 0 评论 -
【Leetcode】2436. Minimum Split Into Subarrays With GCD Greater Than One
了就说明多截取了一个数,保证每次截取的子数组满足条件且最长即可。直接贪心地从左到右遍历,每次截取的子数组最大公约数一旦等于。,问其能最少分为多少个最大公约数大于。原创 2022-11-21 11:38:16 · 114 阅读 · 0 评论 -
【Leetcode】1035. Uncrossed Lines
想象将两个数组排成两行并且左对齐,求一种两个数组的数字之间的连线方式,使得连线互不相交,并且连接的两个数字都相等。其实就是求最长公共子序列长度,可以动态规划。原创 2022-11-21 06:31:40 · 127 阅读 · 0 评论 -
【Leetcode】1054. Distant Barcodes
次(或者更多,但是更多的话就无解了),而这样的数只能有一个,并且一定是第一轮已经排好了,就矛盾了。可以证明这样的方法一定成立,如果存在某两个相邻的位置数字相等,那么这个数字一定出现了。,要求重排之,使得相邻数字不同。直觉上,只需按频率从大到小排序,然后依次排在。这些位置,越界了则再从。原创 2022-11-21 04:06:52 · 219 阅读 · 0 评论 -
【Leetcode】1196. How Many Apples Can You Put into the Basket
和一个重量上限,问不超过重量上限的情况下最多能放多少个苹果。从小到大依次放即可。原创 2022-11-21 06:20:03 · 138 阅读 · 0 评论 -
【Leetcode】1049. Last Stone Weight II(配数学证明)
的正负号的赋予方式(即不管具体石头碰撞能不能实现这种赋予方式)所得的总和最小值一定存在某个碰石头的方案。这样求碰石头这一具体范围的最优解等价于在一个更大的范围上求最优解。,允许每次将两个石头相碰,得重量为两个石头的重量之差的小石头(如果碰的两个石头重量相等,则两个石头都消失)。问最后能得到的重量最小的石头的重量。假设最优解对应的赋正负号的方式已经知道,我们证明,一般的对于。(当然这里的集合是多重集合,不是数学里的那个集合),我们找到这两个集合的最大值,比如其是。首先,最后一个石头的重量的表达式必然为。原创 2022-11-20 15:01:40 · 375 阅读 · 0 评论 -
【Leetcode】1246. Palindrome Removal
是可能的最小值,此外,如果不是这样的删法,可以枚举删掉左端点的时候,那一次删除的右端点的位置,则。,每次允许删除一段回文子数组,问至少多少次可以将整个数组删完。的方案里最后一次删的时候,顺便将两个端点删掉,从而。这一段至少删多少次可以删光,那么答案就是。,那么有一种方案,其是在。原创 2022-11-11 15:30:38 · 366 阅读 · 0 评论 -
【Leetcode】1580. Put Boxes Into the Warehouse II
由于高度最高的柱子我们是可以很方便知道能不能推进去的,所以我们将柱子高度按从高到低排序。接着可以开两个指针指向两端。在还有空位的情况下,先尝试将最高的柱子从左端推入,如果能推入,则计数加。问我们最多可以将多少个柱子推入仓库。注意仓库的两端都是开放的,每个柱子可以从任意一端推进去。如果不能,再尝试从右端推入,如果仍然不能,说明该柱子不可能推入,看下一个柱子。的长度上的高度都是相等的,每隔。的竖着的柱子,再给出一个宽。的仓库,仓库的每个单位。原创 2022-11-09 13:49:06 · 221 阅读 · 0 评论 -
【Leetcode】1564. Put Boxes Into the Warehouse I
显然应该先推高度低的柱子进去。仓库里每个位置能放的高度其实是由其左边的高度最小值决定,我们可以预处理一下每个位置能放的柱子高度是多少。接着从小到大遍历柱子高度,看能推进去多少个柱子即可。问我们最多可以将多少个柱子推入仓库。注意仓库的右端是封闭的,左端是开放的,所以我们只能从左推进去。的长度上的高度都是相等的,每隔。的竖着的柱子,再给出一个宽。的仓库,仓库的每个单位。原创 2022-11-09 13:25:35 · 98 阅读 · 0 评论 -
【Leetcode】1353. Maximum Number of Events That Can Be Attended
如果活动没遍历完,或者堆里还有活动,则进入循环。首先将所有当前时间戳开始的活动的结束时间入堆,这个时候我们可以直接参加堆顶那个活动,将堆顶出堆。算法正确性证明还是比较显然的,如果某个时间戳参加的不是结束时间最早的,我们可以调换为参加那个结束时间最早的,也可以是最优解。将所有活动按开始时间从小到大排序,然后建立一个小顶堆,其存每个活动的结束时间,同时维护一个时间戳。这个时间戳可以视为一根扫描线,我们关注的是这个时间戳是否能参加某个活动,而堆顶则是我们优先要参加的活动(因为它结束的最早)。原创 2022-11-07 12:26:34 · 138 阅读 · 0 评论