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

2021-05-28 05:34:37 字數 951 閱讀 6257

問題:

給定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。

問題求解:

/*簡單演算法:

**v[0]不儲存資料

**t(n)=o(n^2).

*/int maxsum(int *v,int n,int *besti,int *bestj)}}

return sum;

}/*分治法:

**將a[1n]分成a[1n/2]和a[n/2+1n],則a[1n]的最大欄位和有三種情況:

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

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

**(3)a[1n]的最大子段和為ai++aj,1<=i<=n/2,n/2+1<=j<=n

**t(n)=2t(n/2)+o(n)

**t(n)=o(nlogn)

*/int maxsum_div(int *v,int l,int r)

int s2=0;

int rights=0;

for (k=center+1;k<=r;k++)

sum=s1+s2;

if(sum0時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。

**t(n)=o(n)

*/int maxsum_dyn(int *v,int n)

return sum;

}

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

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

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

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

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

題目 給定n個整數 可能為負整數 組成的序列a1,a2,a3,a4,a5,an,求該序列子段和的最大值,子段和 定義為連續 下標遞增 的元素之和。當所有的整數均為負整數時定義其最大子段和為0。如序列為時,最大子段和為20。該問題可以用分治法或者動態規劃來求解。下面給出兩種演算法的思路及 實現 思路 ...