![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 57
dp问题在此!
Skyed.blue
写写博客,记录足迹
展开
-
【leetcode】盈利计划(二维费用01背包)
集团里有 n 名员工,他们可以完成各种各样的工作创造利润。第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作,就不能参与另一项工作。工作的任何至少产生 minProfit 利润的子集称为盈利计划。并且工作的成员总数最多为 n 。有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值。示例 1:输入:n = 5, minProfit = 3, group = [2,2], profit = [2,3]输出:2原创 2021-03-14 20:43:16 · 337 阅读 · 0 评论 -
【leetcode】统计字典序元音字符串的数目(dp,3种写法)
给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。示例 1:输入:n = 1输出:5解释:仅由元音组成的 5 个字典序字符串为 [“a”,“e”,“i”,“o”,“u”]示例 2:输入:n = 2输出:15解释:仅由元音组成的 15 个字典序字符串为[“aa”,“ae”,“ai”,“ao”原创 2020-11-10 20:50:05 · 419 阅读 · 0 评论 -
四方定理 (dp,二维费用背包)
思路分析:我一开始没往背包那想,我想的是dp[i][j]表示 i 值 剩余 j 次分解位的方案总数。第一层 for 遍历 i 值 (1-32768)第二层for 遍历 j 分解位个数 (0-4)第三层for 遍历 k 平方数 (1-sqrt(i))dp[i][j] = dp[i-k*k][j-1]这样写理论上可以实现,但是无法去重。假设i=5, j=1,k 可以取 1, 2. k取1就由dp[4][0]推来,k取2就由dp[1][0]推来。这样就包含了[1,2]和[2,1]两种情况。后来看.原创 2020-10-30 12:21:28 · 282 阅读 · 0 评论 -
摆花 (dp,背包,各种优化)
题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。试编程计算,一共有多少种不同的摆花方案。输入格式第一行包含两个正整数n和m,中间用一个空格隔开。第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1,a2,…,an输出格式一个整数,表示有多少种方案。注意:因为方案数可能很原创 2020-10-30 11:40:28 · 226 阅读 · 0 评论 -
装箱问题 (dp,两种方法)
题目描述有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30,每个物品有一个体积(正整数)。要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入格式1个整数,表示箱子容量1个整数,表示有n个物品接下来n行,分别表示这n个物品的各自体积输出格式1个整数,表示箱子剩余空间。输入输出样例输入2468312797输出0思路分析其实就是背包问题。但是在做的时候想了个新思路。令dp[i] = true表示在 i 体积可以被若干个箱原创 2020-10-29 10:59:00 · 2395 阅读 · 0 评论 -
【leetcode】使数组严格递增 (dp+二分)
给你两个整数数组 arr1 和 arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。每一步「操作」中,你可以分别从 arr1 和 arr2 中各选出一个索引,分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,然后进行赋值运算 arr1[i] = arr2[j]。如果无法让 arr1 严格递增...原创 2020-02-13 21:51:45 · 643 阅读 · 0 评论 -
【leetcode】最长定差子序列 (map+dp)
给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等差子序列的长度。示例 1:输入:arr = [1,2,3,4], difference = 1输出:4解释:最长的等差子序列是 [1,2,3,4]。示例 2:输入:arr = [1,3,5,7], difference = ...原创 2020-02-10 20:39:51 · 203 阅读 · 0 评论 -
【leetcode】二维区域和检索 - 矩阵不可变 (二维前缀和)
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。示例:给定 matrix = [[3, 0, 1, 4, 2],[5, 6, 3, 2, 1],[1, 2, 0,...原创 2020-02-10 20:05:58 · 404 阅读 · 0 评论 -
【leetcode】让字符串成为回文串的最少插入次数 (区间dp)
给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。请你返回让 s 成为回文串的 最少操作次数 。「回文串」是正读和反读都相同的字符串。示例 1:输入:s = “zzazz”输出:0解释:字符串 “zzazz” 已经是回文串了,所以不需要做任何插入操作。示例 2:输入:s = “mbadm”输出:2解释:字符串可变为 “mbdadbm” 或者 “mdbabd...原创 2020-02-09 22:16:40 · 336 阅读 · 0 评论 -
【leetcode】二指输入的的最小距离 (dp)
二指输入法定制键盘在 XY 平面上的布局如上图所示,其中每个大写英文字母都位于某个坐标处,例如字母 A 位于坐标 (0,0),字母 B 位于坐标 (0,1),字母 P 位于坐标 (2,3) 且字母 Z 位于坐标 (4,1)。给你一个待输入字符串 word,请你计算并返回在仅使用两根手指的情况下,键入该字符串需要的最小移动总距离。坐标 (x1,y1) 和 (x2,y2) 之间的距离是 |x1 - ...原创 2020-02-09 21:39:06 · 360 阅读 · 0 评论 -
【leetcode】最长回文子序列 (区间dp)
给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。示例 1:输入:“bbbab”输出:4一个可能的最长回文子序列为 “bbbb”。示例 2:输入:“cbbd”输出:2一个可能的最长回文子序列为 “bb”。链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence思路分析...原创 2020-02-07 21:44:22 · 257 阅读 · 0 评论 -
【leetcode】可被三整除的最大和
给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例 1:输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。示例 3:输入:nums = [1,2,3,4,4]输出:12解...原创 2020-02-03 18:07:11 · 1126 阅读 · 0 评论 -
【leetcode】最长公共子序列(dp)
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没...原创 2020-02-03 16:50:23 · 215 阅读 · 0 评论 -
【leetcode】跳跃游戏 V
给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到:i + x ,其中 i + x < arr.length 且 0 < x <= d 。i - x ,其中 i - x >= 0 且 0 < x <= d 。除此以外,你从下标 i 跳到下标 j 需要满足:arr[i] > arr[j] 且 arr[i] > arr[k] ...原创 2020-02-02 21:29:15 · 199 阅读 · 0 评论 -
【leetcode】最大整除子集(dp+pre数组记录路径)
给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。如果有多个目标子集,返回其中任何一个均可。示例 1:输入: [1,2,3]输出: [1,2] (当然, [1,3] 也正确)示例 2:输入: [1,2,4,8]输出: [1,2,4,8]链接:https://leetcode-cn...原创 2020-01-22 16:27:51 · 223 阅读 · 0 评论 -
【leetcode】停留在原地的方案数(dp)
有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。给你两个整数 steps 和 arrLen ,请你计算并返回:在恰好执行 steps 次操作以后,指针仍然指向索引 0 处的方案数。由于答案可能会很大,请返回方案数 模 10^9 + 7 后的结果。示例 1:输入:steps = ...原创 2019-12-07 20:58:13 · 387 阅读 · 0 评论 -
【leetcode】乘积最大子序列 (线性dp)
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。链接:https://leetcode-cn.com/problems/maximum-pro...原创 2019-11-21 16:28:25 · 214 阅读 · 0 评论 -
买卖股票的最佳时机(分治,dp)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是...原创 2019-11-20 15:50:15 · 1531 阅读 · 1 评论 -
【leetcode】不同的子序列(01背包)
给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)示例 1:输入: S = “rabbbit”, T = “rabbit”输出: 3解释:如下图所示, 有 3 种可以从 S 中得到 ...原创 2019-11-20 14:52:30 · 185 阅读 · 0 评论 -
【leetcode】解码方法(dp)
一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: “12”输出: 2解释: 它可以解码为 “AB”(1 2)或者 “L”(12)。示例 2:输入: “226”输出: 3解释: 它可以解码为 “BZ” (2 26), “VF” (2...原创 2019-11-19 15:38:15 · 171 阅读 · 0 评论 -
【leetcode】最长有效括号(线性dp,栈)
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”链接:https://leetcode-cn.com/problems/longest-valid-parentheses方法一:动态规划 ...原创 2019-11-18 16:08:42 · 236 阅读 · 0 评论 -
【leetcode】最长回文子串(区间dp)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”链接:leetcode原题思路分析:这题是区间dp经典题目。先来看看回文子串的定义:长度为1:a, b. 单个字符就是一个回文串长度为2:aa, bb....原创 2019-11-16 16:54:55 · 351 阅读 · 0 评论 -
最大连续子列和(多种方法)
题目地址在此经典问题,求最大连续区间和。暴力的方法就不说了。这里说三种方法:分治,动态规划,在线处理。方法一:分治 O(nlgn)要求[1,n]的最大连续区间和,可以将区间分成[l,mid],[mid,r],即左右两半。此时,有三种情况。1:该连续区间全部在左半部分。2:该连续区间全部在右半部分。3:该连续区间出现在中间,即a[mid]在区间里。对于情况1,2就是递归左子树,右子...原创 2019-11-14 23:27:40 · 426 阅读 · 0 评论