为了使动态规划适用,一个问题必须具有两个关键属性:最优子结构和重叠子问题[1]。对于这个问题,我们将只关注后一个属性。
重叠子问题有多种定义,其中两个是:
如果找到解决方案涉及多次解决相同的子问题,那么这两种定义(以及互联网上的许多其他定义)似乎都可以归结为一个具有重叠子问题的问题。换言之,有许多小的子问题,在寻找原始问题的解的过程中要多次计算。一个经典的例子是斐波那契算法,很多例子都用它来让人们理解这个特性。
直到几天前,生活还很好,直到我发现了Kadane的算法,这让我质疑重叠的子问题定义。这主要是因为人们对它是否是 DP 算法有不同的看法:
有人不认为 Kadane 算法是 DP 算法的最令人信服的原因是,每个子问题只会在递归实现中出现并计算一次 [3],因此它不需要重叠的子问题属性。然而,互联网上的许多文章认为 Kadane 的算法是一种 DP 算法,这让我质疑我对重叠子问题的理解。
人们似乎对重叠子问题的性质有不同的解释。对于像斐波纳契算法这样的简单问题,很容易看到它,但是一旦你引入卡丹算法,事情就变得非常不清楚了。如果有人能提供一些进一步的解释,我将不胜感激。
你已经读了很多了。我唯一要补充的是:
卡丹算法中的重叠子问题如下:
max_subarray = max(从i=1到n [ max_subarray_to(i) ])
max_subarray_to(i) = max(max_subarray_to(i-1) 数组[i], 数组[i])
如您所见,对于每个i,max_subarray_to()被求值两次。卡丹的算法会记住这些,将其从O(n2)转换为O(n)
...但就像@Stef说的,你叫什么都不重要,只要你懂就好。
我无法弄清楚重叠子问题的DP第一属性在哪里适合子集和问题。然而,我理解最优子结构部分。在执行包含和排除元素的递归解决方案时,问题在哪里重叠 是不是因为这是一个NP问题,所以没有DP的两个性质 问题的链接是http://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem/ 有人能帮助我理解这一点吗。
问题链接如下: https://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem/ 我没有看到重叠的子问题属性在问题中得到满足,至少在输入情况下是如此。例如,在下面的链接中,递归树没有任何重叠的子问题 http://www.zrzahid.com/subset-sum-problem-dynamic-programming/
*正则匹配问题[H] 三角形问题[M] 计算二进制数中1的个数[M] *括号匹配问题[M] 最短路径和[M]
120. Triangle[M] 题目 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4],
22. Generate Parentheses[M] 问题 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: “((()))”, “(()())”,
010. Regular Expression Matching @(leetcode解题思路)[DP] 问题 Implement regular expression matching with support for ‘.’ and ‘*’. ‘.’ Matches any single character. ‘*’ Matches zero or more of the preceding