這個問題就是在原來的基礎上加上了可以迴圈。
那麼我們可以分兩種情況處理,一種是有從尾到頭的,例如1表示取,0表示不取,則是11000011
一種是沒有跨越的, 即000111100
那麼對於第二種情況可以直接用最大欄位和做,關鍵是第一段要怎麼處理。
這裡需要用到逆向思維,在1110000111這乙個答案中,0000是最小字段和,因為總和是一定的 。
那麼我們就可以用類似的方法算出最小字段和,然後用總和一減就ok了。
最後兩種情況取max就是答案。
#include#include#define rep(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
typedef long long ll;
const int maxn = 51234;
int a[maxn], n;
ll ans, sum, ans1, ans2;
int main()
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 最大子段和
給出乙個整數陣列a 正負數都有 如何找出乙個連續子陣列 可以乙個都不取,那麼結果為0 使得其中的和最大?例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。輸入 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 a i 10 9 輸出 輸出最大...
51nod 最大子段和
題面 以乙個長為n的數列,求連續子段的最大值。思路1直接列舉o n 3 tle穩穩的 include using namespace std int n,a 50050 ans int main ans max ans,t 更新最值 cout n return 0 字首和優化的列舉法,o n 2 還...