問題 a: 最大子段和
時間限制: 1 sec 記憶體限制: 128 mb
[提交] [狀態]
題目描述
geobiyye是乙個喜歡思考問題的女孩子。
geobiyye給了你乙個序列,她想求出這個序列的最大子段和。
geobiyye覺得這個問題太簡單了,她將問題擴大了一倍。於是現在問題變成了:從這個序列中選出不相交的兩個連續段,要求它們的和最大。
換句話說,對於給定的長度為n的序列ai,你需要給出 a,b,c,d,滿足1≤a≤b≤c≤d≤n ,並且最大化下列式子:
現在geobiyye不會這道題了,於是她將問題拋給了你。
輸入第一行乙個正整數n,表示序列長度。
接下來一行n個整數a1,a2,a3,…,an,表示題目描述中的序列。
輸出一行乙個整數表示最大值。
樣例輸入 copy
72 -4 3 -1 2 -4 3
樣例輸出 copy7提示
選擇的兩個區間分別為[3,5]和[7,7]。
【資料範圍】
對於30%的資料:n≤100 。
對於60%的資料:n≤1000 。
對於100%的資料:n≤105,|ai|≤109 。
題目大意:給你乙個序列,求出這個序列中兩個互不相交的子串行的和的最大值。
思路:由於找兩個互不相交的子串行,我們可以從左到右,再從右到左分別求出這個序列的dp()值,然後在這些dp()值互不重疊的情況下分別找出兩個dp()的最大值相加即可。具體實現呢,可以簡化這個思想,只需找出乙個dp()值就可以,我們找出正序的dp()陣列,對於逆序的情況呢,用一層for迴圈,每一次迴圈,我們用乙個變數temp來存放從i到n的這些子串行中的最大子段和,然後和1到i的最大子段和相加,這樣經歷n次迴圈之後我們就找到了所要求的值。
#include
#include
#include
#define inf -999999999
using
namespace std;
int ans[
50050
],dp[
50050];
intmain()
printf
("%d\n"
,solve)
;return0;
}
最大子段和問題 最大子段和
設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...
最大子段和
問題表述 n個數 可能是負數 組成的序列a1,a2,an.求該序列 例如 序列 2,11,4,13,5,2 最大子段和 11 4 13 20。1 窮舉演算法 o n3 o n2 2 分治法 將序列a 1 n 從n 2處截成兩段 a 1 n 2 a n 2 1 n 例項 三 最大子段和 問題表述 n個...
最大子段和
再給頂的n個數的陣列中選出連續的若干個數,使得他們的和是最大的,即最大連續自序列和.列如.序列.1 2 3 1 6 5 9 結果 當取子串行 3,1,6,5,9 結果12 我的思路.1.最大連續子串行的開頭是在1.n之中.的最大連續和 2.求出以i,開頭的最大連續和,此時開頭已經確定了,那麼通過列舉...