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

2021-08-29 01:24:19 字數 1097 閱讀 8135

n個整數組成的迴圈序列a11,a22,a33,…,ann,求該序列如aii+ai+1i+1+…+ajj的連續的子段和的最大值(迴圈序列是指n個數圍成乙個圈,因此需要考慮an−1n−1,ann,a11,a22這樣的序列)。當所給的整數均為負數時和為0。

例如:-2,11,-4,13,-5,-2,和最大的子段為:11,-4,13。和為20。

input

第1行:整數序列的長度n(2 <= n <= 50000) 

第2 - n+1行:n個整數 (-10^9 <= sii <= 10^9)

output

輸出迴圈陣列的最大子段和。

sample input

6

-211

-413

-5-2

sample output

20
迴圈陣列最大子段和與常規最大子段和的區別就在於:迴圈陣列比非迴圈陣列多了一種最大子段在截點處兩端的情況。

求l的最小值:對所有元素取負,這樣求得-l的最大值,再取負即是l的最小值。最後比較兩種情況下求得的最大子段和的值,取最大的就ok了。

#include#includeusing namespace std;

__int64 a[50005];

__int64 dp[50005];

__int64 d[50005];

__int64 b[50005];

int main()

dp[1]=a[1];

ans=a[1];

d[1]=b[1];

ais=b[1];

for(i=1;i<=n;i++)

ans=max(ans,sum+ais);//取最大

if(ans<0)

printf("0\n");

else

printf("%i64d\n",ans);

return 0;

}

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...

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

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...