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

2021-08-20 11:46:53 字數 1195 閱讀 8894

1050 迴圈陣列最大子段和

基準時間限制:1 秒 空間限制:131072 kb 分值: 10 

難度:2級演算法題

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
思維題,這道題比基礎的最大連續子段和多加了乙個迴圈,那麼我們很容易的就可以得到最終的結果應該是兩種情況;

1、直接就是中間部分的連續子段和最大;

2、兩邊的加起來最大;

答案應該是這兩種情況的最大值,第一種情況非常好求,那麼我們怎麼求出來第二種呢,我們可以這樣想,第二種情況的值應該是陣列和sum減去中間子段的和k,要使第二種情況取得最大值,那麼我們就要中間的最小,我們可以直接對原來的陣列取反,求出中間連續子段和的最大值k'(由於是取反,因而這其實就是k的相反數),最終第二種情況的答案應該為sum-k=sum+k'。

最終答案即為max(第一種情況,sum+k').

#include#includeusing namespace std;

#define maxn 100500

typedef long long ll;

ll a[maxn];

ll solve(ll a,ll n)//求最大子段和

else

if(ms>mh)

}return mh;

} int main()

ll ans1=solve(a,n);

for(ll i=0;i

ll ans2=solve(a,n);

cout<

return 0;

}

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