最大子段和問題

2021-07-11 23:20:35 字數 1611 閱讀 1768

給定n

個整數(有可能是負數)組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。

也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有元素,從而找出問題的解。 

將原問題分解為若干個子問題,並且原問題的解與子問題的解之間存在某種確定的關係,這種關係通常表現為:

1)原問題的解只存在於其中乙個較小規模的子問題中;

2)原問題的解與其中乙個較小規模的解之間存在某種對應關係。

動態規劃法將待求解問題分解成若干個相互重疊的子問題,每個子問題對應決策過程的乙個階段,一般來說,子問題的重疊關係表現在對給定問題求解的遞推關係(稱動態規劃函式)中,將子問題的解求解一次並填入表中,當需要再次求解此子問題時,可以通過查表獲得該子問題的解,從而避免了大量重複計算。

求解過程:

1)劃分子問題:將原問題分解為若干個子問題,每個子問題對應乙個決策階段,並且子問題之間具有重疊關係。

2)確定動態規劃函式:根據子問題之間的重疊關係找到子問題滿足的遞推關係式(即動態規劃函式),這是關鍵。

3)填寫**:設計**,以自底向上的方式計算各個子問題的解並填表,實現動態規劃過程。

**實踐:

#include#include#includeusing namespace std;

#define max 10000

//蠻力法

int bf_sum(int a,int n)

sum+=a[j];

} }return max;

}//分治法

int maxsum1(int a,int left,int right)

else

int s2=0;

int rights=0;

for(int j=center+1;j<=right;j++)

sum=s1+s2;

if(sum0)

b[i]=b[i-1]+a[i];

else

b[i]=a[i];

} for(int j=0;jsum)

sum=b[j];

} delete b;

return sum;

}//主函式

最大子段和問題

給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0 分治法 分析 首先將陣列分為兩部分,最大子段和 可以在陣列的左半部分也可以在右半部分,也可以橫跨分割點,因此我們只需要用分治思想求出左邊最大...

最大子段和問題

問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如 a i a i 1 a j 當所給的整數均為負數時定義子段和為0.如果序列中全部是負數則 最大子段和為0,依次所定義 所求的最優值max,1 i問題解析 動態規劃演算法 dp i 包含元素i的子段和 dp 0 ...

最大子段和問題

給定n個整數 可能為負整數 a1,a2,a3 an.求形如 ai,a i 1 aj i,j 1,n,i j 的子段和的最大值。當所有的整數均為負整數的時候定義其最大子段和為0,例如 當 a1,a2,a3,a4,a5,a6 2,11,4,13,5,2 時,最大子段和為 i 2,j 4 下標從1開始 列...