題目:
給定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開始
).如果直接用經典二分法,我們發現,原問題被分成了兩個獨立的問題,這是不符合題目的。因此我們在左右兩部分的基礎上,再加上中間部分,進行求解
#includeusingnamespace
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的最...