【问题标题】:How does the max subarray problem have an optimal substructure?最大子数组问题如何具有最优子结构?
【发布时间】:2021-07-19 15:48:34
【问题描述】:

据我了解,您需要一个问题才能拥有适用于动态编程的最佳子结构。

这是我不明白的。

取如下数组

A = [1, 6, -3, 1, 5, -1]

根据维基百科:

在计算机科学中,如果可以从其子问题的最优解构造出最优解,则称该问题具有最优子结构。此属性用于确定动态规划和贪心算法对问题的有用性。

这就是我的困惑所在。

如果我被要求在上面给出的数组中找到大小为 3 的最大子数组,答案将是 1、5、-1(总和为 5)。

但如果我要找到大小为 2 的最大子数组,答案将是 (1,6),它与前一个答案没有共享元素。

我一定不明白最优子结构的含义,但我不明白如何。

【问题讨论】:

  • 贪心算法不一定有最优子结构。
  • 关键字是“子问题”。首先设计一个蛮力算法来解决问题。然后分析蛮力算法以确定它是否一遍又一遍地解决相同的子问题。如果是这样,那么该算法是动态规划的候选者。最大子数组问题的蛮力解决方案是一个简单的 O(n) 滑动窗口。而 O(n) 理论上是解决该问题的最佳时间,因此动态规划没有任何好处。

标签: algorithm


【解决方案1】:

这里的重叠子问题不是子数组长度,而是包含数组长度。因此,如果F(i:j, s) 给出从索引i 到索引j 的包含(子)数组中长度为s 的最大值子数组,那么我们可以证明

F(0:k, s) = Max( F(0:k-1, s), F(k-s+1:k, s) )

这是重叠的最优子结构。

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2020-02-17
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多