[英]Dynamic Programming (max sum)
給定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)}
如您所說, M[j] = maximum sum over all windows ending at j
。 因此,在為0
和n - 1
之間的所有j
計算M[j]
之后。 您最多輸出它們。 這是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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.