51Nod 1050 迴圈陣列最大子段和(dp)

2021-07-09 21:06:50 字數 720 閱讀 5273



題目:

其實就是求迴圈陣列的最大欄位和

題意:給定乙個長度為50000的陣列,求它的迴圈陣列的最大子段和。

分析:本題與普通的最大子段和問題不同的是,最大子段和可以是首尾相接的情況,即可以迴圈。那麼這個題目的最

大子段和有兩種情況

(1)正常陣列中間的某一段和最大。這個可以通過普通的最大子段和問題求出。

(2)此陣列首尾相接的某一段和最大。這種情況是由於陣列中間某段和為負值,且絕對值很大導致的,那麼我

們只需要把中間的和為負值且絕對值最大的這一段序列求出,用總的和減去它就行了。

即,先對原陣列求最大子段和,得到ans1,然後把陣列中所有元素符號取反,再求最大子段和,得到ans2,

原陣列的所有元素和為ans,那麼最終答案就是max(ans1, ans + ans2)

**:

#include"stdio.h"

#include"stdlib.h"

#define n 50001

int a[n];

int n;

long long maxsum(int a)

return max;

}int main()

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