給定乙個整數序列,找到乙個具有最大和的連續子串行(子串行最少包含乙個元素),返回其最大和。
例項輸入: -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#includeint max(int a, int b)
intmain()
printf(
"%d\n
", ans);
return0;
}
變式:兩段最大連續子串行--poj1481
思路:這道題目的基礎就是最大連續子串行和,但是更加強化了。核心思路是從前往後和從後往前分別得到dp,再分別用另乙個陣列儲存到某位置最大值,然後再找最大值。具體看**。
#include#includeusing
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 ...