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