51nod1050 迴圈陣列最大子段和

2022-08-15 05:45:14 字數 1099 閱讀 5183

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。和為20。

input

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

第2 - n+1行:n個整數 (-10^9 <= s[i] <= 10^9)

output

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

6

-211

-413

-5-2

output示例

20

這題區間是可以迴圈的,如果不迴圈的狀態轉移方程是

if(dp[i-1]>0)

dp[i]=dp[i-1]+a[i];

else

dp[i]=a[i];

再遍歷一遍找最大dp就可以,而這裡是由兩種情況組成的:

一,就是上面不迴圈的情況求出最大值ans

二,迴圈的話可以認為不要中間一段最大負段和,因為可以頭部一段加尾部一段。

所以最終就是二者取最大值

**:

#include#include

#include

#define ll long long

#define inf 0x3f3f3f3f

using

namespace

std;

ll n,a[

50005

];ll maxsum(ll a)

//求最大段和

returnm;}

intmain()

ll ans=maxsum(a);//

正向求不迴圈的最大段和

for(int i=0;i)

a[i]=-a[i];

ll ans1=maxsum(a);//

求序列最大的負段和的相反數,ans1+sum為去除最大負數段和

coutreturn0;

}

51nod 1050 迴圈陣列最大和

感覺自己的碼力還很差 思維愚鈍 一開始把他搞成2倍長度來做 然後列舉每乙個始點加長度為n的陣列跑乙個dp 這樣複雜度高達o n 2 實際上我們可以分析一下 這個max有可能在1 n內取到 也有在迴圈陣列中取到 所以我們先跑一段1 n的dp 記為ans1 然後我們跑一段迴圈陣列內的dp 記為ans2 ...

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

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

51nod 1050 迴圈陣列最大子段和 最大子段和的公升級版,有乙個可以迴圈的子段,也就是首尾可以相連,如果首尾相連,那麼中間空出來的一段就是應該是最小字段和。那麼答案應該是從原版得出的值和首尾相接得出的值取最大的即可。include include include include include...