簡體   English   中英

動態編程(最大和)

[英]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 因此,在為0n - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM