有一由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 ...