給定由n個整數組成的序列(a1, a2, …, an),最大子段和問題要求該序列形如圖的最大值(1≤i≤j≤n),當序列中所有整數均為負整數時,其最大子段和為0。例如,序列(-20, 11, -4, 13, -5, -2)的 最大子段和為:。
最大子段和問題的分治策略是:
(1)劃分:按照平衡子問題的原則,將序列(a1, a2, …, an)劃分成長度相同的兩個子串行(a1, …, a[n/2] )和(a[n/2], …, an),則會出現以下三種情況:
① a1, …, an的最大子段和=a1, …,a[n/2] 的最大子段和;
② a1, …, an的最大子段和=a[n/2]+1, …, an的最大子段和;
③ a1, …, an的最大子段和=,且1<=i<=[n\2],[n/2]+1<=j<=n
(2)求解子問題:對於劃分階段的情況①和②可遞迴求解,情況③需要分別計算。
(3)合併:比較
#include
using namespace std;
int maxsum(int a,int left,int right)
int sum=0;
if(left==right)
if(a[left]>0)sum=a[left];
else sum=0;
else
int center=(left+right)/2;
int leftsum=maxsum(a,left,center);
int rightsum=maxsum(a,center+1,right);
int s1=0;int lefts=0;
for(int i=center;i>=left;i--)
lefts+=a[i];
if(lefts>s1)s1=lefts;
int s2=0;int rights=0;
for(int j=center+1;j<=right;j++)
rights+=a[j];
if(rights>s2)s2=rights;
sum=s1+s2;
if(sumif(sumreturn sum;
int main()
int a[6]=;
int b=maxsum(a,0,5);
cout<}
在劃分階段的三種情況下的最大子段和,取三者之中的較大者為原問題的解。
4 4最大子段和問題(動態規劃)
問題 給定有n個整數 包含負整數 組成的序列a1,a2,a3,an,求該序列子段和的最大值。注意 當所有整數均為負值時,定義其最大欄位和為0 由bj的定義 bj是1到j位置的最大子段和 易知,當bj 1 0時bj bj 1 aj,否則bj aj。則計算bj的動態規劃遞迴式 bj max,1 j n。...
最大子段和問題
給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0 分治法 分析 首先將陣列分為兩部分,最大子段和 可以在陣列的左半部分也可以在右半部分,也可以橫跨分割點,因此我們只需要用分治思想求出左邊最大...
最大子段和問題
給定n 個整數 有可能是負數 組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有...