最大子段和問題動態規劃解法和分治策略解法深度分析

2021-10-04 11:09:31 字數 1397 閱讀 9803

給定由n個整數(包括負整數)組成的序列a1,a2,…,an,求該序列子段和的最大值。(當所有整數均為負值時定義其最大子段和為0。)

定義輔助子段陣列bjbi是1到j位置的最大子段和(必須包括bj)

由bj的定義易知,當bj-1>0時bj=bj-1+aj,否則bj=aj。

則計算bj的動態規劃遞迴式:

bj=max,1<=j<=n。

定義結果sumj:sumj的值就是1到j的這段陣列的最大子段和(區別bj,sumj是1到範圍內最大子段和即問題的解)

由sumj定義知:sum初值0,如果bj>sumj-1,更新sumj=bj,否則sumj=sumj-1;

再設定besti和bestj在bj和sumj更新時記錄最大子段的起始節點

#define num 1001

int a[num]

;int

maxsum

(int n,

int&besti,

int&bestj)

if(b>sum)

return sum;

}

(1)劃分:按照平衡子問題原則,將序列a1,a2,…,an劃分成長度相同的兩段子序列a1,…,a[n/2]和a[n/2+1],…,an),則會出現以下三種情況:

(2)求解子問題:對於劃分階段的情況①和②可以繼續遞迴求解,情況③則分別計算s1=max,s2=max,則s1+s2為情況③的最大子段和。

(3)合併:比較在劃分階段的三種情況下的最大子段和,取三者中的較大者為原問題的解即sum=max

}時間效能:

最大子段和與最大子陣和 動態規劃解法

在乙個陣列中找出和最大的連續幾個數。至少包含乙個數 例如 陣列a 2,1,3,4,1,2,1,5,4 則連續的子串行 4,1,2,1 有最大的和6.輸入格式 第一行輸入乙個不超過1000的整數n。第二行輸入n個整數a i 輸出格式 第一行輸出乙個整數,表示最大的和。include includeus...

動態規劃 最大子段和問題

問題 給定n個整數 可以為負數 的序列 a1 a2 an 求其最大子段和 連續的某個子串 分析 蠻力法的話,o n2 分治法,將序列分為左右兩部分分別求最大子段和,從分界點開始向兩邊分別找最大子段和再合併,取最大即可。複雜度遞推式 t n 2t n 2 o n o nlogn 動態規劃,最優子結構的...

動態規劃 最大子段和

給定乙個陣列a a0,a1,a2,an 求陣列中 連續子段之和 的最大值。1 最簡單的演算法 窮舉法 計算所有的連續子段之和,得出最大值 窮舉法 計算所有的子串行和 o n 3 public static int maxsum1 int data max tmp max tmp max return...