算法----DP
sunlanchang
北京邮电大学-计算机硕士,sunlanchang@bupt.edu.cn
展开
-
LeetCode 518. 零钱兑换 II
Description给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 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解释: 只用面额2的硬币不能凑成总金额3。示例 3:输入: amount = 10, coins原创 2020-09-16 15:39:02 · 179 阅读 · 0 评论 -
LeetCode 300. 最长上升子序列
Description给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-increasing-subsequence著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。Solution定义dp[i]为考虑前 i原创 2020-09-15 16:44:38 · 117 阅读 · 0 评论 -
LeetCode 486. 预测赢家 (博弈论、区间DP)
Description给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。示例 1:输入:[1, 5, 2]输出:False解释:一开始,玩家1可以从1和2中进行选择。如果他选择 2(或者原创 2020-09-04 11:09:12 · 170 阅读 · 0 评论 -
LeetCode 338. 比特位计数
Description给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/counting-bits著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。Solution题解奇数:二进原创 2020-09-04 10:18:37 · 168 阅读 · 0 评论 -
516. 最长回文子序列(区间DP)
Description给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。示例 1:输入:"bbbab"输出:4一个可能的最长回文子序列为 "bbbb"。示例 2:输入:"cbbd"输出:2一个可能的最长回文子序列为 "bb"。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence著作权归领扣网络所有原创 2020-08-19 22:12:32 · 208 阅读 · 0 评论 -
LeetCode 647. 回文子串(区间DP)
Description给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:"abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:"aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindro原创 2020-08-19 21:55:03 · 140 阅读 · 0 评论 -
LeetCode 392. 判断子序列 (双指针或者动态规划)
Description给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = "abc", t = "ahbgdc"返回 true.示例 2:s = "axc原创 2020-07-27 22:12:47 · 160 阅读 · 0 评论 -
LeetCode 264. 丑数 II
Description编写一个程序,找出第 n 个丑数。丑数就是只包含质因数 2, 3, 5 的正整数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明: 1 是丑数。n 不超过1690。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problem...原创 2019-11-12 11:09:44 · 207 阅读 · 0 评论 -
LeetCode 714. 买卖股票的最佳时机含手续费(动态规划)
Description给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能够达到的最大原创 2020-07-14 23:10:54 · 305 阅读 · 0 评论 -
LeetCode 123. 买卖股票的最佳时机 III(动态规划)
Description给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [3,3,5,0,0,3,1,4]输出: 6解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。 随后,在第 7 天(股票价格 = 1)的时候买入,在第原创 2020-07-14 18:22:30 · 189 阅读 · 0 评论 -
LeetCode 122. 买卖股票的最佳时机 II(动态规划)
Description给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候原创 2020-07-14 17:00:57 · 221 阅读 · 0 评论 -
LeetCode 121. 买卖股票的最佳时机(动态规划)
Description给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6...原创 2020-04-22 22:14:56 · 229 阅读 · 0 评论 -
LeetCode 309. 最佳买卖股票时机含冷冻期(动态规划)
Description给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]来源:力扣(LeetCode)链接:https://lee原创 2020-07-14 12:46:47 · 194 阅读 · 0 评论 -
LeetCode 面试题 17.13. 恢复空格 (动态规划)
Description哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相原创 2020-07-09 17:33:19 · 212 阅读 · 0 评论 -
LeetCode329. 矩阵中的最长递增路径 (回溯或者拓扑排序+动态规划)
Description给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums = [ [9,9,4], [6,6,8], [2,1,1]] 输出: 4 解释: 最长递增路径为 [1, 2, 6, 9]。示例 2:输入: nums = [ [3,4,5], [3,2,6], [2,2,1]] 输出: 4 解释: 最长递增路径是 [3原创 2020-07-08 22:08:04 · 338 阅读 · 0 评论 -
LeetCode 63. 不同路径 II (动态规划或者回溯)
Description一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[ [0,0,0], [0,1,0], [0,0,0]]输出: 2解释:3x3 网格的正中间原创 2020-07-06 12:39:46 · 202 阅读 · 0 评论 -
LeetCode 32. 最长有效括号(栈或者DP)
Description给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-valid-parentheses著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。原创 2020-07-05 18:08:50 · 218 阅读 · 0 评论 -
LeetCode 140. 单词拆分 II (动态规划)
Description给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入:s = "catsanddog"wordDict = ["cat", "cats", "and", "sand", "dog"]输出:[ "cats and dog", "cat sand dog"]示例 2原创 2020-07-04 21:27:10 · 264 阅读 · 0 评论 -
LeetCode 139. 单词拆分(动态规划)
Description给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:输入: s = "applepenapple原创 2020-07-04 18:05:26 · 511 阅读 · 1 评论 -
LeetCode 91. 解码方法(动态规划)
Description一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。来源:力扣(LeetCode)原创 2020-07-03 17:59:37 · 223 阅读 · 0 评论 -
LeetCode 62. 不同路径(回溯、动态规划)
Description一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> 向下 -> 向右原创 2020-07-03 16:47:13 · 332 阅读 · 0 评论 -
LeetCode 10. 正则表达式匹配(回溯)
Description给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例 2:原创 2020-06-29 13:38:12 · 268 阅读 · 0 评论 -
面试金典 面试题46. 把数字翻译成字符串
Description给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"来源:力扣(LeetCode)链接:https://leetcode-cn.com/pr原创 2020-06-09 22:27:35 · 215 阅读 · 0 评论 -
LeetCode 983. 最低票价(dp)
Description在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数...原创 2020-05-06 21:41:31 · 228 阅读 · 0 评论 -
LeetCode 198. 打家劫舍
Description你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 =...原创 2020-04-02 20:35:56 · 122 阅读 · 0 评论 -
面试金典 面试题 17.16. 按摩师(DP)
Description一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 ...原创 2020-03-24 21:26:37 · 296 阅读 · 0 评论 -
LeetCode 72. 编辑距离(DP)
Description给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -&...原创 2020-03-18 22:15:16 · 198 阅读 · 0 评论 -
Leetcode 152. 乘积最大子序列
Description给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。来源:力扣(LeetCode)链接:https://leetc...原创 2020-03-01 22:10:32 · 195 阅读 · 0 评论 -
Leetcode 70. 爬楼梯
Description假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 ...原创 2019-11-17 08:56:12 · 113 阅读 · 0 评论 -
Leetcode 718. 最长重复子数组(最长公共子串)
描述给两个整数数组 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] < 100Solution建立二维数组匹配,注...原创 2019-08-20 16:31:58 · 303 阅读 · 0 评论 -
Leetcode674. 最长连续递增序列
Description给定一个未经排序的整数数组,找到最长且连续的的递增序列。示例 1:输入: [1,3,5,4,7]输出: 3解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。示例 2:输入: [2,2,2,2,2]输出: 1解释: 最长连续递增序列是 [2], 长度为1。注意...原创 2019-08-20 16:00:19 · 119 阅读 · 0 评论 -
剑指 offer 变态跳台阶(DP)
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。Solution时间复杂度O(n^2):a[n]=a[n-1]+a[n-2]+......+a[1]+a[0]其中a[0]=a[1]=1,a[2]=2。# -*- coding:utf-8 -*-class Solution: def jumpFloorII(s...原创 2019-07-19 15:55:37 · 214 阅读 · 0 评论 -
剑指 offer 跳台阶(DP)
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。Solution斐波那锲数列变形。# -*- coding:utf-8 -*-class Solution: def jumpFloor(self, number): ans = [None] * 100 ans[1] = 1...原创 2019-07-19 15:37:19 · 186 阅读 · 0 评论 -
Leetcode 53. 最大子序和(动态规划)
描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。Solutionclass Solution: def maxSubArray(self, nums: List[int]) -> i...原创 2019-07-12 16:50:36 · 296 阅读 · 0 评论 -
Leetcode 118. 杨辉三角(动态规划)
描述给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]Solution动态规划递推。class Solution: def generate(self, n...原创 2019-07-12 15:08:04 · 217 阅读 · 0 评论 -
HDU 1465 不容易系列之一(错排)
Description同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?Input输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数n(1<n<=20),n表示8006的网友的人数。Output对于每行输入请输出可能的错误...原创 2019-01-28 20:14:04 · 271 阅读 · 0 评论 -
牛客网 N阶楼梯问题 (动态规划)
题目描述N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求采用非递归)输入描述:输入包括一个整数N,(1&lt;=N&lt;90)。输出描述:可能有多组测试数据,对于每组数据,输出当楼梯阶数是N时的上楼方式个数。示例1输入4输出5Solution#include &lt;iostream&gt;#include &lt;cstdio&gt;#inclu...原创 2019-01-28 20:01:23 · 648 阅读 · 0 评论 -
HDU - 1421 搬寝室(动态规划)
Description给定n个物品,每个物品有重量,从中选出m对,使得这m对物品重量差的平方和最小。疲劳度:m对物品重量差的平方和Input每组输入数据有两行,第一行有两个数n,k(2&lt;=2*k&lt;=n&lt;2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).Output对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.Sa...原创 2019-01-28 19:48:24 · 316 阅读 · 1 评论