动态规划
文章平均质量分 51
葛济维的博客
总想日更博客的小白
展开
-
小红取数(动态规划)———面试真题
小红取数时间限制:1秒 空间限制:256M描述小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。你能帮帮她吗?输入描述:第一行输入两个正整数 n 和 k第二行输入 n 个正整数 ai1≤n,k≤1031\leq n, k \leq 10^31≤n,k≤1031≤ai≤10101 \leq a_i \leq 10^{10}1≤ai≤1010输出描述:如果没有合法方案,输出 -1。否则输出最大的和。集合:前i个数组中选择一些数 并且 这些数的和必原创 2022-06-14 20:06:56 · 8723 阅读 · 1 评论 -
乘积为正(动态规划)——3.21美团面试题
乘积为正时间限制: 1000MS内存限制: 65536KB题目描述:小美现在有一个序列,序列中仅包含1和 - 1两种数字。小美现在想要知道,有多少个连续的子序列,序列中的数字乘积为正。输入描述第一行一个正整数n,表示小美手中的序列长度。第二行n个空格隔开的数字,每个数字只能是1和 - 1中的一种。对于80 % 的数据保证1 ...原创 2022-06-14 18:23:24 · 333 阅读 · 0 评论 -
583. 两个字符串的删除操作(动态规划) - 力扣(LeetCode)
两个字符串的删除操作给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的一个字符。示例 1:输入: word1 = “sea”, word2 = “eat”输出: 2解释: 第一步将 “sea” 变为 “ea” ,第二步将 "eat "变为 “ea”示例 2:输入:word1 = “leetcode”, word2 = “etco”输出:4提示:1原创 2022-06-01 17:33:37 · 243 阅读 · 0 评论 -
516. 最长回文子序列(动态规划) - 力扣(LeetCode)
最长回文子序列给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。示例 2:输入:s = “cbbd”输出:2解释:一个可能的最长回文子序列为 “bb” 。集合:dp[i][j]dp[i][j]dp[i][j]表示从 iii 到 jjj 的回文子序列属性:最长的长度集合的划分:按s[i]和s[j原创 2022-06-01 17:20:28 · 231 阅读 · 0 评论 -
322. 零钱兑换 (三种方法,逐步优化时间复杂度)- 力扣(LeetCode)
零钱兑换给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1题解同一个题目的不同种解法使用 Leetcode 组合总和 的思路因为每个硬币都可以选无数次,那么我们可以使用固定的顺序选择硬币遇到原创 2022-05-13 13:27:20 · 539 阅读 · 1 评论 -
518. 零钱兑换 II(记忆化搜索+排序剪枝、DP动态规划) - 力扣(LeetCode)
零钱兑换 II给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。示例 1:输入:amount = 5, coins = [1, 2, 5]输出:4解释:有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1代码AC代码记忆化搜索+排序剪枝class原创 2022-05-13 12:04:08 · 213 阅读 · 0 评论 -
322. 零钱兑换 (记忆化搜索)- 力扣(LeetCode)
零钱兑换给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1记忆化搜索递归树将能凑成当前金额,使用的最少硬币个数记录下来如果重复计算,就直接拿去记忆化数组中的值class Solution原创 2022-05-10 20:28:15 · 188 阅读 · 0 评论 -
416. 分割等和子集(记忆化搜索、DP动态规划) - 力扣(LeetCode)
分割等和子集给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例 1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。示例 2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。题解记忆化搜索dp的思路,但是使用的是记忆化搜索一维是数据下标,二维代表的是到此下标时累加到的和我们用二维数组来记录从此时的原创 2022-05-10 19:50:48 · 174 阅读 · 0 评论 -
LeetCode 1049. 最后一块石头的重量 II (01背包问题)
最后一块石头的重量 II有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。示例 1:输原创 2022-01-14 12:03:48 · 373 阅读 · 0 评论 -
友好城市(线性DP、最长上升子序列)————《信息学奥赛一本通》
友好城市Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。输入格式第1行,一个整数N,表示城市数。第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和原创 2022-01-13 12:09:53 · 101 阅读 · 0 评论 -
leetcode 1043. 分隔数组以得到最大和 (动态规划)
分隔数组以得到最大和给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。返回将数组分隔变换后能够得到的元素最大和。注意,原数组和分隔后的数组对应顺序应当一致,也就是说,你只能选择分隔数组的位置而不能调整数组中的顺序。示例 1:输入:arr = [1,15,7,9,2,5,10], k = 3输出:84解释:因为 k=3 可以分隔成 [1,15,7] [9] [2,5,10],结果为 [15,15,15原创 2022-01-12 12:11:28 · 326 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串 【动态规划】
剑指 Offer 46. 把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”提示:0 <= num < 231动态规划class原创 2021-12-23 11:19:10 · 66 阅读 · 0 评论