给定一系列 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)}
答案 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。