給定由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 ...