分治法(2) 最大子段和

2022-10-09 13:30:11 字數 852 閱讀 8336

題目:

給定n個元素的整數列(可能為負整數)

a1,a2,…

,an.

求形如:ai,ai+1,…

aj(i/j=1

…n,i<=j)

的子段使其和為最大。當所有整數為負整數時定義其最大欄位和為0。

例如當(a1,a2,a3,a4,a5,a6)

=(-2,11,-1,13,-5,-2)

最大欄位和為i=2,j=4(下標從1開始

).如果直接用經典二分法,我們發現,原問題被分成了兩個獨立的問題,這是不符合題目的。因此我們在左右兩部分的基礎上,再加上中間部分,進行求解

#includeusing

namespace

std;

int a[200005

];int

n;int max_mid(int mid)//

中間部分

int s2=a[mid+1],rights=0

;

for(int i=mid+1;i<=n;i++)

return s1+s2;

}int max_sum(int left,int

right)

//二分

int maxleft=max_sum(left,mid);

int maxright=max_sum(mid+1

,right);

int maxmid=max_mid(mid);

return

max(max(maxleft,maxright),maxmid);

}int

main()

cout

<1,n)<

}

最大子段和之分治法

問題描述 給定乙個陣列,找出其中可以構成最大數的子段,需要注意的是,這個不同於最大子串行求和 最大字段求和 字段必須是連續的 最大子串行求和 子串行只要是包含在原來的序列中即可 舉個例子 1 4 3 1 5 1 4 5 2 求上述的陣列中的最大欄位和,不難得知,最大子段和就是 10 也就是子段4 3...

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

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

演算法設計 最大子段和問題 分治法

演算法設計 最大子段和問題 分治法 給定由n個整數組成的序列 a1,a2,an 最大子段和問題要求該序列形如 最大子段和問題的分治策略是 1 劃分 按照平衡子問題的原則,將序列 a1,a2,an 劃分成長度相同的兩個子串行 a1,a n 2 和 a n 2 an 則會出現以下三種情況 a1,an的最...