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

2021-07-22 23:25:35 字數 1191 閱讀 8463

問題:

給定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[1

**(1)a[1

**(2)a[1

**(3)a[1

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

**t(n)=o(nlogn)

*/int

maxsum_div(

int*

v,int

l,int

r)ints2=

0;intrights=0

;for(k=

center+1

;k<=

r;k++

)sum=s1

+s2;

if(sum

<

lsum)

sum=

lsum;

if(sum

<

rsum)

sum=

rsum;

}return

sum;}/*

動態規劃演算法:

**b[j]=max,1<=i<=j,且1<=j<=n,則所求的最大子段和為max b[j],1<=j<=n。

**由b[j]的定義可易知,當b[j-1]>0時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。該問題可以用分治法或者動態規劃來求解。下面給出兩種演算法的思路及 實現 思路 ...