4 4最大子段和問題

2021-10-05 13:43:09 字數 1184 閱讀 6440

給定由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 個整數 有可能是負數 組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有...