最大子列和

2022-01-26 03:15:45 字數 1626 閱讀 8533

給出乙個長度為 n 的序列 a,選出其中連續且非空的一段使得這段和最大。

第一行是乙個整數,表示序列的長度 n。

第二行有 n 個整數,第 i個整數表示序列的第 i個數字 \(a_i\) 。

輸出一行乙個整數表示答案。

輸入

7

2 -4 3 -1 2 -4 3

輸出
資料範圍

對於 40% 的資料,保證 n \(\leq\) 2 \(\times\)

\(10^3\)。

對於 100% 的資料,保證 n \(\leq\) 2 \(\times\)

\(10^5\),-\(10^4\)

\(\leq\)

\(a_i\)

\(\leq\)

\(10^4\)。

計算出每個子串行的和再選出其中最大的那乙個。(注意:根據這道題目的資料範圍來說,這個思路會tle)

#include#includeusing namespace std;

typedef long long int ll;

int main()

ll maxsum=a[1];

for(int i=1;i<=n;i++)//i代表子串行的左端點

cout《將乙個序列分成兩段,分別求兩個子串行的最大子串行和,再求出越過序列分界點的最大子串行和,那麼序列的最大子串行和一定是三個值中的最大值。

1)如何求兩個子串行的最大子串行和?

答:將這兩個子串行分別再分成兩段,當子串行中只有乙個數字的時候最大子列和就是這個數字,再遞迴返回就可以了。

2)如何求出越過序列分界點的最大子串行和?

答:從分界點左端掃瞄,維護出乙個leftmax;同理,右端維護出乙個rightmax。leftmax+分界點處的值+rightmax即為所求。

#include#includeusing namespace std;

typedef long long int ll;

int a[200005];

ll cal(int l,int r)

thissum=0;

for(int i=mid+1;i<=r;i++)

return max(max(cal(l,mid),cal(mid+1,r)),leftmax+a[mid]+rightmax);//求出cal(l,mid),cal(mid+1,r),leftmax+a[mid]+rightmax三者之間的最大值

}int main()

cout《根據題意我們可以得出以下結論:

1)第乙個數字為有效序列。

2)如果乙個數加上上乙個有效序列得到的結果比這個數大(即前面的子列和》0),那麼該數也屬於這個有效序列。

3)如果乙個數加上上乙個有效序列得到的結果比這個數小(即前面的子列和<0),那麼這個數單獨成為乙個新的有效序列,我們需要將前面的子列和拋棄,即重新歸0。

綜上,我們可以得出以下**:

#include#include#includeusing namespace std;

typedef long long int ll;

int main()

cout

}

最大子列和

int maxsubsequencesum const int a,int n if thissum maxsum 如果新的子列和更大,則更新子列和 maxsum thissum return maxsum 時間複雜度o n3 int maxsubsequencesum const int a,in...

最大子列和

最大連續子串行和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。注 為方便起見,如果所有整數均為負數,則最大子串行和為0。解決這樣乙個問題是乙個很有趣的過程,我們可以...

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...