最大子段和

2021-10-05 06:01:11 字數 1168 閱讀 8810

問題 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,開頭的最大連續和,此時開頭已經確定了,那麼通過列舉...