演算法分析之最大子段求和(一)

2022-08-31 05:30:20 字數 942 閱讀 8787

給定由n個整數(包含負整數)組成的序列a1,a2,...,an,求該序列子段和的最大值。

當所有整數均為負值時定義其最大子段和為0。

所求的最優值為:

例如,當(a1,a2, ……a7,a8)=(1,-3, 7,8,-4,12, -10,6)時,最大子段和為:

分治方法求解

從問題的解的結構可以看出,它適合於用分治策略求解:

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

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

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

a[1:n]的最大子段和為下面的形式。

a、b這兩種情形可遞迴求得。

對於情形c,容易看出,a[n/2]與a[n/2+1]在最優子串行中。因此,我們可以在a[1:n/2]和a[n/2+1:n]中分別計算出s1和s2。則s1+s2即為出現情形c使得最優值。

c 等價於求從某個元素開始的子段和的最大值

例如:求從陣列0開始的子段和的最大值

sum=0,max=0;

for(int i=0;i<=n;i++)

以下是整體**:

int maxsubsum(int a, int left, int right)

int s2=0;rights=0;

for (int i=center+1;i<=right;i++)

sum=s1+s2;

if (sum

if (sum

} return sum;

}

最大子段求和

includeusing namespace std int main if temp 0 捨棄之前的子段 cout 舉個例子,a 4 顯然最大子段和是 9 2 11 該 從頭到尾掃瞄一次,如果只有一項,則最大子段和是它本身,不管是否為負數還是正數。假設第二項為正數的話,顯然最大子段和就是第二項本身...

最大子段和演算法分析

最大子段和問題 maximum interval sum 一.問題描述 給定長度為n的整數序列,a 1.n 求 1,n 某個子區間 i j 使得a i a j 和最大.或者求出最大的這個和.例如 2,11,4,13,5,2 的最大子段和為20,所求子區間為 2,4 二.演算法分析 1.窮舉法 1 i...

演算法題之 最大子串

題目 給定一字串只包含數字,請寫乙個演算法,找出該字串中的最長不重複子串 不重複是指子串中每一元素不同於子串中其他元素 如 120135435 最長不重複子串為 201354 方法一 輔助陣列,o n n private static string norepeatsubstring string ...