动态规划算法
动态规划原理及常见问题分析过程
W24-
这个作者很懒,什么都没留下…
展开
-
动态规划——编辑距离
问题来源:leetcode 72。编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例原创 2020-12-30 10:14:46 · 231 阅读 · 0 评论 -
动态规划——买卖股票的最佳时机 Ⅳ
问题来源:leetcode 188。买卖股票的最佳时机 Ⅳ给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入:k = 2, prices = [2,4,1]输出:2解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润原创 2020-12-28 16:45:00 · 262 阅读 · 3 评论 -
动态规划——K 站中转内最便宜的航班
问题来源:leetcode 787。K 站中转内最便宜的航班有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。动态规划优化子结构:设 dp[i][j]dp[i][j]dp[i][j] 表示最多经过 iii 个中转站从起点 srcsrcsrc 到达 jjj 的最小代价:如果最后一步不需要原创 2020-12-27 16:53:16 · 447 阅读 · 1 评论 -
动态规划——不同的子序列(二)
问题来源:leetcode 940。不同的子序列(二)给定一个字符串 S,计算 S 的不同非空子序列的个数。因为结果可能很大,所以返回答案模 10^9 + 7.示例 1:输入:"abc"输出:7解释:7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。示例 2:输入:"aba"输出:6解释:6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。示例 3:输入:"aaa"输出:原创 2020-12-26 22:04:33 · 1038 阅读 · 0 评论 -
动态规划——两个子序列的最大点积
问题来源:leetcode 1458。两个子序列的最大点积给你两个数组 nums1 和 nums2。请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5] 是 [1,2,3,4,5] 的一个子序列而 [1,5,3] 不是。示例 1:输入:nums1 = [2,1,-2,5], nums2 = [3,0,-6]输出:18解释:从 nums原创 2020-12-26 19:31:28 · 395 阅读 · 0 评论 -
动态规划——最长湍流子数组
问题来源:leetcode 978。最长湍流子数组当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:若 i <= k < j,当 k 为奇数时,A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1],且当 k 为奇数时,A[k] < A[k+1]。也就是说,如果比较符号在子数组中的每个相邻元素对之间翻原创 2020-12-26 11:22:44 · 191 阅读 · 0 评论 -
动态规划——最长回文子序列
问题来源:leetcode 516。问题定义给定一个字符串 s,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000。示例 1:输入:"bbbab"输出:4一个可能的最长回文子序列为 "bbbb"。示例 2:输入:"cbbd"输出:2一个可能的最长回文子序列为 "bb"。提示:1 <= s.length <= 1000s 只包含小写英文字母转换成最长公共子序列问题最长公共子序列。首先将字符串反转,然后求这两个字原创 2020-12-25 18:53:01 · 1394 阅读 · 1 评论 -
动态规划——一和零问题
问题来源:leetcode 474。问题描述给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的大小,该子集中最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的子集。示例 1:输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0原创 2020-12-25 10:33:05 · 493 阅读 · 0 评论 -
Dynamic Programming——动态规划原理总结
动态规划原理分治算法的思想是将计算问题分解为规模较小的相似的子问题,然后分别求解这些子问题,再将子问题的解合并为原始问题的解。分治算法相对简单、直观、独立地处理各个子问题,而不对划分产生的子问题的特性和相互联系进行研究,导致了求解某些子问题的分治算法效率不高。“Dynamic Programming”中的“Programming”并非“编程”之意,而是“借助表格求解问题”的意思。动态规划采用分治的思想求解计算问题,并利用子问题之间的关联特性来提高计算效率,其计算过程依赖两个特征:优化子结构:如果优原创 2020-10-13 23:10:29 · 382 阅读 · 0 评论