如果將所給的序列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 時,最大子...