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

2021-10-04 15:12:57 字數 1098 閱讀 6831

最大連續子串行時動態規劃的經典問題之一,在給定的序列中,找出乙個連續的子串行,使得整個連續子串行的和最大,輸出這個最大序列的和。

分析:1、連續子串行用陣列a[n]儲存

2、設定陣列dp[n] ,dp[i]表示以a[i]為末尾的連續子串行的最大和(化解子問題)

3、先找到問題的邊界,當n=0時,和最大的連續子串行為即dp[0] = a[0](邊界)

4、對於dp[i]有兩種情況:

(1)dp[i] = dp[i - 1] + a[i],以a[i]結尾和最大的連續子串行有多個元素,則把a[i]接在a[i - 1]後組成新的連續子串行

(2)   dp[i] = a[i],以a[i]結尾和最大的連續子串行只有乙個元素即a[i]本身(以a[i - 1]結尾的連續序列最大和為負數)

5、對於4、中的情況取較大者dp[i] = max(轉移方程)

6、求dp陣列的最大值,即an數列的最大連續子串行的和

給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的「序列和」。 對於s的所有非空連續子串行t,求最大的序列和。 變數條件:n為正整數,n≤1000000,結果序列和在範圍(-2^63,2^63-1)以內。

第一行為乙個正整數n,第二行為n個整數,表示序列中的數。
輸入可能包括多組資料,對於每一組輸入資料,

僅輸出乙個數,表示最大序列和。

示例1

5

1 5 -3 2 4

61 -2 3 4 -10 6

4-3 -1 -2 -5

9

7-1

#include #include using namespace std;

int main()

int maximum = dp[0];

dp[0] = a[0]; //邊界

for(int i = 1; i < n; i ++)

cout << maximum << endl;

}return 0;

}

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

題目大意就是讓你選出一段和最大的連續序列,當有幾個序列和並列時,選出下標最小的的連續序列。可以採用動態規劃的思想解決,設一連續序列為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最大,輸出這個最大和。樣例 211 413 5 2顯然 11 4 13 20 為和最大的選取情況,因此最大和為20 下面介紹動態規劃的做法,複雜度為o n 讀者會發現其實左端點的列舉是沒有...

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

給定乙個數字序列,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...