給定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開始 列...