最大子段和詳解

2021-05-06 18:09:35 字數 1090 閱讀 5544

問題的提出:

給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整均為負數時定義子段和為0,依此定義,所求的最優值為

max,1<=i<=j<=n

例如,當(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)時,最大子段和為20

方法一:

蠻力法方法二:

分治法演算法描述如下:

針對最大子段和這個具體問題本身的結構,我們還可以從演算法設計的策略上對上述o(n^2)計算時間演算法進行更進一步的改進。從問題的解結構也可以看出,它適合於用分治法求解。

如果將所給的序列a[1:n]分為長度相等的兩段a[1:n/2]和a[n/2+1:n],分別求出這兩段的最大子段和,則a[1:n]的最大子段和有三種情況:

(1) a[1:n]的最大子段和與a[1:n/2]的最大子段和相同

(2) a[1:n]的最大子段和與a[n/2+1:n]的最大子段和相同

(3) a[1:n]的最大子段和為a[i]+…+a[j],並且1<=i<=n/2,n/2+1<=j<=n。

對於(1)和(2)兩種情況可遞迴求得,但是對於情況(3),容易看出a[n/2],a[n/2+1]在最大子段中。因此,我們可以在a[1:n/2]中計算出s1=max(a[n/2]+a[n/2-1]+…+a[i]),0<=i<=n/2,並在a[n/2+1:n]中計算出s2= max(a[n/2+1]+a[n/2+2]+…+a[i]),n/2+1<=i<=n。則s1+s2為出現情況(3)的最大子段和。據此可以設計出最大子段和問題的分治演算法如下:

**如下:

方法三:

動態規劃法

演算法描述如下:

在對於上述分治演算法的分析中我們注意到,若記b[j]=max(a[i]+a[i+1]+..+a[j]),其中1<=i<=j,並且1<=j<=n。則所求的最大子段和為max b[j],1<=j<=n。

由b[j]的定義可易知,當b[j-1]>0時b[j]=b[j-1]+a[j],否則b[j]=a[j]。故b[j]的動態規劃遞迴式為:

b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。

**如下:

最大子段和詳解

最大子段和問題 maximum interval sum 有時也稱lis 經典的動態規劃問題,幾乎所有的演算法教材都會提到.本文將分析最大子段和問題的幾種不同效率的解法,以及最大子段和問題的擴充套件和運用.一.問題描述 給定長度為n的整數序列,a 1 n 求 1,n 某個子區間 i j 使得a i ...

最大子段和問題 詳解(C

最大子段和或稱為最大部分和 maximum subtotal 問題,以下簡稱ms。舉例說明 例如 暴力破解 brute force 可以從串的任意位置開始在連續的任意位置結束,一層迴圈控制起始位置,一層迴圈控制結束位置。複雜度 o n 2 迭代 include include using names...

最大子段和

設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...