動態規劃 陣列最大子陣列和

2021-08-14 14:28:58 字數 1229 閱讀 8144

問題描述:

給定乙個整數陣列a[0~n],求陣列a的子陣列,使其元素和為最大。

問題分析:

方法一:可以用普通的方法列舉所有的子陣列,然後求出最大的子陣列和,時間複雜度為o(n*n)。

方法二:問題描述符合動態規劃最優子結構的要求。

設b[i]表示以a[i]結尾 的子陣列的最大子段和,即:

b[i]=max,其中0<=j<=i,j<=k<=i。

因此對於陣列a[0~n]的最大欄位和為max,其中0<=i在計算b[i]時,可以考慮以下三種情況:

1,b[i] = b[i-1]+a[i],當b[i-1]>0時,這時候的b[i]中包含a[i]。

2,b[i] = a[i],當b[i-1]<=0,這時候以a[i]重新作為b[i]的起點。

3,b[i]不包含a[i]的情況,這種情況在計算b[i]之前已經計算處結果,儲存在b[0~i-1]中。最後計算max時會考慮到。

b[i] = max。

而陣列a[0~n]則為max。

在實現時,可以省略陣列b[i]。實現如下:

[cpp]view plain

copy

1 #include 

2 using

namespace

std;  

3 #define n 10   

4 int

max_sub_array(

int&s,

int&e,

int* a)  

5   

19                 else

20                   

24                 if

(sum

25                   

30         }  

31         return

sum;  

32 }  

33 int

main()  

34 ;  

36         int

start,end;  

37         int

sum = max_sub_array(start,end,a);  

38         cout << sum << "  "

<" "

<

39 }   

動態規劃 陣列最大子陣列和

問題描述 給定乙個整數陣列a 0 n 求陣列a的子陣列,使其元素和為最大。問題分析 方法一 可以用普通的方法列舉所有的子陣列,然後求出最大的子陣列和,時間複雜度為o n n 方法二 問題描述符合動態規劃最優子結構的要求。設b i 表示以a i 結尾 的子陣列的最大子段和,即 b i max,其中0 ...

動態規劃 陣列最大子陣列和 收藏

問題描述 給定乙個整數陣列a 0 n 求陣列a的子陣列,使其元素和為最大。問題分析 方法一 可以用普通的方法列舉所有的子陣列,然後求出最大的子陣列和,時間複雜度為o n n 方法二 問題描述符合動態規劃最優子結構的要求。設b i 表示以a i 結尾 的子陣列的最大子段和,即 b i max,其中0 ...

動態規劃 最大子陣列

解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...