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