POJ 最大連續子串行和

2022-07-05 18:12:11 字數 1285 閱讀 4428

給定乙個整數序列,找到乙個具有最大和的連續子串行(子串行最少包含乙個元素),返回其最大和。

例項輸入: -2, 1, -3, 4, -1, 2, 1, -5, 4

例項輸出: 6(連續子串行4, -1, 2, 1的和最大,為 6。)

下面介紹動態規劃的做法,複雜度為 o(n)。

步驟 1:令狀態 dp[i] 表示以 a[i] 作為末尾的連續序列的最大和(這裡是說 a[i] 必須作為連續序列的末尾)。

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

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

這個最大和的連續序列有多個元素,即從前面某處 a[p] 開始 (p

對第一種情況,最大和就是 a[i] 本身。

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

於是得到狀態轉移方程:dp[i] = max

這個式子只和 i 與 i 之前的元素有關,且邊界為 dp[0] = a[0],由此從小到大列舉 i,即可得到整個 dp 陣列。接著輸出 dp[0],dp[1],...,dp[n-1] 中的最大子即為最大連續子串行的和。

#include#include

int max(int a, int b)

intmain()

printf(

"%d\n

", ans);

return0;

}

變式:兩段最大連續子串行--poj1481

思路:這道題目的基礎就是最大連續子串行和,但是更加強化了。核心思路是從前往後和從後往前分別得到dp,再分別用另乙個陣列儲存到某位置最大值,然後再找最大值。具體看**。

#include#include

using

namespace

std;

const

int n = 50500

;int a[n],s1[n],s2[n],dp1[n],dp2[n];//

s1,s2分別記錄到第i個位置的最大序列和(並不要求以i結尾)

intans, n;

void

f()

for(int i=n-2;i>=0;i--)

for(int i=1;i1]+s2[i]);

}int

main()

return0;

}

最大連續子串行和

最大連續子串行和問題是個很老的面試題了,最佳的解法是o n 複雜度,當然其中的一些小的地方還是有些值得注意的地方的。這裡還是總結三種常見的解法,重點關注最後一種o n 的解法即可。需要注意的是有些題目中的最大連續子串行和如果為負,則返回0 而本題目中的最大連續子串行和並不返回0,如果是全為負數,則返...

最大連續子串行和

求最大連續子串行和 分析 用乙個陣列存入輸入的數字。用乙個變數temp從0開始往後加,存放累計的和,用sum變數存放出現過的最大和。當temp遇到負數會減小,但不能初始化為0重新累計,因為後面還有可能出現正數,和會比前面sum大的情況。只有當temp遇到負數減到小於0時,temp初始化為0重新開始加...

最大連續子串行和

include include include include include include include include include include using namespace std typedef long long ll define pi 3.1415926535897932 ...