一,題目:
最大子段和:
給定乙個長度為n的一維陣列a,請找出此陣列的乙個子陣列,使得此子陣列的和sum=a[i]+a[i+1]+……+a[j]最大,其中i>=0,i=i,j
例如:31 -41 59 26 -53 58 97 -93 -23 84
子矩陣59+26-53+58+97=187為所求的最大子陣列。
二,原始碼
第一種:直接窮舉法:
#include using namespace std;
int main()
; int sum;
int maxsofar=0;
for(int i = 0 ;i< 10;++i)//控制子陣列開始位置
;int sum;
int maxsofar=0;
int current[10];
current[0]=a[0];
for(int i=1 ;i< 10;++i) //首先生成個數為1,2,3……10個的陣列和
for(int i=0;i< 10;++i)
}cout<<"maxsofar:"《第三種:動態規劃
下面我們來分析一下最大子段和的子結構,令b[j]表示從a[0]~a[j]的最大子段和。
b[j]的當前值只有兩種情況:
(1) 最大子段一直連續到a[j]
(2) 以a[j]為起點的子段 //如果不是第(1)種,則(1)肯定為負,捨去
還有一種情況,那就是最大字段沒有包含a[j],如果沒有包含a[j]的話,那麼在算b[j]之前的時候我們已經算出來了,注意我們只是算到位置為j的地方,所以最大子段在a[j]後面的情況我們可以暫時不考慮。
由此我們得出b[j]的狀態轉移方程為:b[j]=max,
所求的最大子段和為max;
int b=0,sum=a[0];
for(int i=0;i<10;i++)
cout<<"maxsum:"
}
演算法複雜度:o(n) 最大子段和問題解析
題目描述 最大子段和 給定乙個長度為n的一維陣列a,請找出此陣列的乙個子陣列,使得此子陣列的和sum a i a i 1 a j 最大,其中i 0,i i,j 例如 31 41 59 26 53 58 97 93 23 84 子矩陣59 26 53 58 97 187為所求的最大子陣列。第一種 直接...
演算法設計與分析 最大子段和問題
給定由 n個整數組成的序列 求該序列形如 1 分別用蠻力法 分治法和動態規劃法設計最大子段和問題的演算法 2 比較不同演算法的時間效能 3 給出測試資料,寫出程式文件。實驗2.1最大欄位和問題.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include using namespa...
演算法設計 最大子段和問題 動態規劃
演算法設計 最大子段和問題 動態規劃 問題 給定有n個整數 包含負整數 組成的序列a1,a2,a3,an,求該序列子段和的最大值。注意 當所有整數均為負值時,定義其最大欄位和為0 由bj的定義 bj是1到j位置的最大子段和 易知,當bj 1 0時bj bj 1 aj,否則bj aj。則計算bj的動態...