迴圈陣列的最大子段和

2021-09-03 03:45:15 字數 1131 閱讀 6941

time limit: 1000 ms memory limit: 65536 kib

submit

statistic

problem description

給出乙個陣列,陣列首尾相連,詢問最大連續子段和為多少。

input

首先輸入乙個t表示t (1<=t<=50) 組資料,然後每組資料首先輸入乙個n (1<=n<=1e5) 表示有n個數字,然後輸入n個數字(題目保證數字範圍在 int 內),表示所求陣列。

output

陣列最大的連續子段和。

sample input

1

710 -100 1 -2 -5 3 4

sample output 

17
hint

全是負數的時候,最大的連續子段和為 0。

source

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

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

(2)此陣列首尾相接的某一段和最大。這種情況是由於陣列中間某段和為負值,且絕對值很大導致的,那麼我們只需要把中間的和為負值且絕對值最大的這一段序列求出,用總的和減去它就行了。

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

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

#include using namespace std;

long long make(int a, int n) // 求陣列的最大連續子段和

return ans;

}int main()

ans1 = make(a, n); // 求原數租的最大子段和

for (int i = 0; i < n; i++)

ans2 = make(a, n); // 求取反後的最大子段和

printf("%lld\n", max(sum + ans2, ans1));

}return 0;

}

迴圈陣列最大子段和(DP)

輸入 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 s i 10 9 輸出輸出迴圈陣列的最大子段和。輸入示例 6 2 11 4 13 5 2輸出示例 分析 1 笨方法,我們可以用普通最大子段和的方法解決這個問題。我們從每個位置 斷開 環,然後按普通的最大子段和的方...

hpuoj 迴圈陣列最大子段和

時間限制 1 sec 記憶體限制 128 mb 提交 19 解決 6 狀態kaca在做了最大子段和問題之後,思考若陣列可以首尾相接的話最大子段和應該是多少。有多組測試資料。每一組的第一行是乙個整數n n。下面一行是n n個以空格分開的整數a i ai。1 n 10000 1 n 10000 0 ai...

迴圈陣列最大子段和 dp

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