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

2021-10-19 15:53:33 字數 1044 閱讀 6234

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

給出乙個整數序列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

令dp[i]表示以a[i]作為末尾的連續序列的最大和。於是,最大連續子串行和便是陣列dp中的最大值。

有兩種情況:

①最大和的連續序列只有乙個元素,即a[i]本身。

②最大和的連續序列有多個元素,即從前面的某個a[j]開始,一直到a[i]結束,也就是dp[i]=a[j]+...+a[i-1]+a[i]。而a[j]+...+a[i-1]=dp[i-1],即dp[i]=dp[i-1]+a[i]。

由於只有這兩種情況,於是得到狀態轉移方程dp[i]=max。

只需將i從小到大列舉並依次遍歷,即可得到整個dp陣列。接著輸出該陣列中的最大值,即最大連續子串行的和。

#include#includeusing namespace std;

const int maxn=1000000;

long long a[maxn];

long long dp[maxn];

long long maxsubsequence(int n)

int answer=maxsubmatrix(n);

cout<}

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...