动态编程(最大总和)

时间:2015-03-06 04:32:58

标签: algorithm dynamic-programming

给定一系列 n 实数 A(1)... A(n),确定一个连续的子序列 A(i).. A(j),子序列中的元素总和最大化。

解决方案是:

M(j) = max sum over all windows ending in j

M(j) = max{M(j-1) +A[j], A[j]}

有人可以解释一下这对于以下子序列是如何工作的: 1, 5, -10, 5。因为在第一个5-10之间,重复会在-4 (M(j-1) +A[j])-10 (M(j-1) +A[j])之间进行选择。但是,最好的总和是6

所以不应该再次出现:

M(j) = max{M(j-1) +A[j], A[j], M(j-1)}

1 个答案:

答案 0 :(得分:0)

正如你所说M[j] = maximum sum over all windows ending at j。 所以在为M[j]j之间的所有0计算n - 1之后。您输出它们的最大值。 这是C ++中的示例代码。

int findMax(int a[], int n){
    int * M = new int[n];
    M[0] = a[0];
    for(int i=1; i<n; i++)
        M[i] = max(M[i-1] + a[i], a[i]);
    int ans = M[0];
    for(int i=1; i<n; i++)
        ans = max(ans, M[i]);

    return ans;
}

代表您的序列{1, 5, -10, 5}M = {1, 6, -4, 5},答案是M中的最大值,即6。