動態規劃之最大子段和問題

2021-08-11 03:18:13 字數 1191 閱讀 9442

有一由n個整數組成的序列a=,求該序列如

a[i]+a[i+1]+…+a[j]的子段和的最大值。如果序列中全部是負數則最大子段和為0,依此定義,所求的最優值max,1≤i≤j≤n。

輸入:n //序列的長度

序列值輸出:最大子段和

例如:

輸入:

6 -2,11,-4,13,-5,-2

輸出:

20演算法可通過動態規劃求解:

我們用b[j]來記錄以j為結尾的子段和集合中的最大值。

舉個例子:假如有乙個序列:-2,11,-4,13,-5,-2有:

a[1]=-2, a[2]=11, a[3]=-4, a[4]=13, a[5]=-5, a[6]=-2;

b[1]=-2, b[2]=11, b[3]=7, b[4]=20, b[5]=15, b[6]=13;

b[1]<0, b[2]>0, b[3]>0, b[4]>0, b[5]>0, b[6]>0;

遞推關係:

b[j]=max(b[j-1]+a[j], a[j]) //b[j]表示以j結尾的字段和集合中的最大值

由此可寫出如下**:

#include

using

namespace

std;

int a[100];

int b[100];

int max(int a,int b);

int getmaxsum(int a,int n,int &begin,int &end);

//a 儲存序列

//n 序列長度

//begin end 開始、結束的位置

int main()

maxsum=getmaxsum(a,n,begin,end);

cout

<<"最大欄位和為:"

<<"開始位置為:"

<<"結束位置為:"

0;}

int getmaxsum(int a,int n,int &begin,int &end)

}for(int i=end;i>=0;i--)

}return max;

}int max(int a,int b)

else

return b;

}

動態規劃之最大子段和問題

問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算...

動態規劃之最大子段和問題

問題描述 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。依此定義,所求的最優值為 例如,當 a1,a2 a3 a4 a5 a6 2,11,4,13,5,2 時,最大子段和為 11 4 13 20 1 最大子段和問題的簡單演算...

模板 動態規劃之最大子段和 最大子矩陣問題

給出一段序列,選出其中連續且非空的一段使得這段和最大。input 第一行是乙個正整數n n 200000 表示了序列的長度。第接下來的n行包含n個絕對值不大於10000的整數a i 描述了這段序列。output 僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。sample input 2 ...