最大子段和問題的分治演算法和動態規劃演算法

2021-08-03 09:11:40 字數 774 閱讀 6047

如果將所給的序列a[1:n]分為長度相等的兩段a[1:n/2]和a[n/2:n],分別求出這兩段的最大子段和,則a[1:n]的最大子段和有三種情形:(當所有整數均為負數時定義其最大子段和為0)

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

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

3)a[1:n]的最大子段和為σ(k=i~j)ak,且1<=i<=n/2,n/2+1<=j<=n;

(1)(2)可遞迴求得。對於(3),容易看出a[n/2]與a[n/2+1]在最優子串行中。據此可以設計出分治演算法如下:

#includeusing namespace std;

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

s2=0;

rights=0;

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

sum=s1+s2;

if(sum

設b[j]為序列a[k]從i~j的各子段和中的最大值(1<=j<=n)。有b[j-1]>0時,b[j]=b[j-1]+a[j],否則b[j]=a[j]。

所以b[j]的動態規劃式為:b[j]=max   (1<=j<=n)

#includeusing namespace std;

int maxsum(int n,int *a)

return sum;

}int main()

; int s;

s=maxsum(5,a);

cout<

最大子段和問題(分治法和動態規劃)

什麼是最大子段和,通俗點講 最大子段和就是給了一些數,然後你從中找了幾個連續的數,這組連續的數的和比任意一組連續的數的和都大,那麼你找的這幾個連續的數的和就是這些數的最大子段和。通俗的聽不懂你就看這裡 給定由n個整數 可能為負整數 組成的序列 分治法思想 如果將所給的序列a 1 n 分為長度相等的兩...

演算法設計 最大子段和問題 分治法

演算法設計 最大子段和問題 分治法 給定由n個整數組成的序列 a1,a2,an 最大子段和問題要求該序列形如 最大子段和問題的分治策略是 1 劃分 按照平衡子問題的原則,將序列 a1,a2,an 劃分成長度相同的兩個子串行 a1,a n 2 和 a n 2 an 則會出現以下三種情況 a1,an的最...

最大子段和 分治與動態規劃

問題 給定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 時,最大子...