動態規劃 最大連續子串行和

2021-09-11 07:04:59 字數 1721 閱讀 8570

動態規劃-最大連續子串行和

問題描述

給定乙個數字序列a1,a2,…,an,求i,j(1<=i<=j<=n),使得ai+…aj最大,輸出這個最大和。

樣例

-211

-413-

5-2顯然 11+(

-4)+

13=20 為和最大的選取情況,因此最大和為20

下面介紹動態規劃的做法,複雜度為o(n),讀者會發現其實左端點的列舉是沒有必要的。

步驟一:令狀態dp[i]表示以a[i]作為末尾的連續序列的最大和(這裡是說a[i]必須作為連續序列的末尾)。以樣例為例:序列-2 11 -4 13 -5 -2,下標分別記為 0,1,2,3,4,5,那麼

dp[0]

=-2,

dp[1]=

11,dp[2]=

7(11+

(-4)

),dp[3]=

20(11+

(-4)

+13)dp[4]

=15dp[5]=

13(11+

(-4)

+13+(

-5)+

(-2)

)

通過設定這麼乙個dp陣列,要求的最大和其實就是dp[0],dp[1],…,dp[n-1]中的最大值(因為到底以哪個元素結尾未知),下面想辦法求解dp陣列。

步驟二:作如下考慮:因為dp[i]要求是必須以a[i]結尾的連續序列,那麼只有兩種情況:

這個最大和的連續序列只有乙個元素,即以a[i]開始,以a[i]結尾。

這個最大和的連續序列有多個元素,即從前面某處a[p]開始(p < i),一直到a[i]結尾。對第一種情況,最大和就是a[i]本身。

對第二種情況,最大和就是dp[i-1]+a[i]

由於只有這兩種情況,於是得到狀態轉移方程:

dp[i] = max

**如下

#include

#include

#include

using namespace std;

const

int maxn =

10010

;int a[maxn]

,dp[maxn]

;// a[i]存放序列,dp[i]存放以a[i]結尾的連續序列的最大和

intmain()

// 邊界

dp[0]

= a[0]

;for

(int i =

1; i < n ; i++

)int k =0;

for(

int i =

1; i < n ; i++)}

printf

("%d\n"

,dp[k]);

return0;

}

4. 狀態的無後效性

狀態的無後效性是指:當前狀態記錄了歷史資訊,一旦當前狀態確定,就不會再改變,且未來的決策只能在已有的乙個或若干個狀態的基礎上進行,歷史資訊只能通過已有的狀態去影響未來的決策。

對動態規劃可解的問題來說,總會有很多設計狀態的方式,但並不是所有狀態都具有無後效性,因此必須設計乙個擁有無後效性的狀態以及相應的狀態轉移方程,否則動態規劃就沒有辦法得到正確結果。事實上,如何設計狀態和狀態轉移方程,才是動態規劃的核心,而它們也是動態規劃最難的地方。

動態規劃 最大連續子串行和

題目大意就是讓你選出一段和最大的連續序列,當有幾個序列和並列時,選出下標最小的的連續序列。可以採用動態規劃的思想解決,設一連續序列為a 0 a 1 a n 分別以a 0 a 1 a n 結尾的最大序列和為d 0 d 1 d n 若d i 1 0,則d i d i 1 a i 若d i 1 0,則d ...

動態規劃 最大連續子串行和

給定乙個數字序列,a1,a2,an,求i,j 1 i j n 使得ai aj最大,輸出這個最大和。樣例輸入 2 11 4 13 5 2 輸出 20 即11 4 13 20 最大 分析 如果暴力做的話,乙個列舉,需要o n 2 在計算需要o n 一共需要o n 3 因為重複計算的太多了,還是設定乙個d...

動態規劃 最大連續子串行和

在刷力扣題的時候遇到了乙個連續子陣列最大和問題,下面是題目的鏈結和描述 輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。時間...