問題:
給定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。該問題可以用分治法或者動態規劃來求解。下面給出兩種演算法的思路及 實現 思路 ...