演算法設計 最大子段和問題解析(對應演算法第三題)

2021-08-26 20:14:58 字數 1021 閱讀 7610

一,題目:

最大子段和:

給定乙個長度為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的動態...