51nod 最大子段和

2021-08-18 22:32:35 字數 1351 閱讀 7159

題面

以乙個長為n的數列,求連續子段的最大值。

思路1直接列舉o(n^3)tle穩穩的

#include

using

namespace

std;

int n, a[50050], ans;

int main()

ans = max(ans, t);//更新最值}}

cout

<"\n";

return

0;}

字首和優化的列舉法,o(n^2),還是tle

#include

using

namespace

std;

int n, a[50050], ans;

int main()

for(int i = 1; i <= n; i++)//列舉起點

for(int j = i; j <= n; j++)//列舉終點

ans = max(ans, a[j]-a[i-1]);//更新最值

cout

<"\n";

return

0;}

思路2

分治。以中間元素為基準,向左求出以中間元素為尾的最大子段和,向右求出以中間元素為首的最大子段和,兩部分相加即橫跨左右兩部分的最大子段的和,三者最大即為答案。複雜度o(nlogn),可以水過,記得不開longlong會wa。

#include

#include

using

namespace

std;

typedef

long

long ll;

int n, a[50050];

ll dfs(int l, int r)

ll rsum = 0, rmax = 0;

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

return max(lmax+rmax,max(ls,rs));

}}int main()

思路3

dp(覆蓋了所有狀態),如果當前記錄的子段的和為負數時,就要以下乙個點為起點重新找子段了。複雜度o(n),ac穩穩的。

#include

#include

using

namespace

std;

typedef

long

long ll;

int n, a[50050];

int main()

cout

<"\n";

return

0;}

51nod 最大子段和

給出乙個整數陣列a 正負數都有 如何找出乙個連續子陣列 可以乙個都不取,那麼結果為0 使得其中的和最大?例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。輸入 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 a i 10 9 輸出 輸出最大...

51nod 迴圈陣列最大子段和

這個問題就是在原來的基礎上加上了可以迴圈。那麼我們可以分兩種情況處理,一種是有從尾到頭的,例如1表示取,0表示不取,則是11000011 一種是沒有跨越的,即000111100 那麼對於第二種情況可以直接用最大欄位和做,關鍵是第一段要怎麼處理。這裡需要用到逆向思維,在1110000111這乙個答案中...

51nod 迴圈陣列最大子段和 dp

n個整數組成的迴圈序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續的子段和的最大值 迴圈序列是指n個數圍成乙個圈,因此需要考慮a n 1 a n a 1 a 2 這樣的序列 當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13...