想了很久才體會出這道題的奧妙,愛恨交加的複雜情感。
思路:題目要求必須做交換操作,那麼就有以下三種情況:
顯然,1、2兩種情況與交換與否無關,即只有情況3才體現出了交換的價值。
那麼對於情況3我們又可以分兩類:
僅分析a類情況,b類情況相似。那麼我們需要從左邊找乙個最大的數交換到子段中,設此最大的數是a[k],交換到a[i]的位置(即k同時我們要求出(以a[i-1]結尾的、a[i]左側的最大子段和)以及(以a[i+1]為首的、a[i]右側的最大子段和)。
求解(以a[i-1]結尾的、a[i]左側的最大子段和):可在從左至右遍歷a[i]的同時找出a[k]和左側最大子段和,若子段和小於0則捨去;
求解(以a[i+1]為首的、a[i]右側的最大子段和):可以預先處理,從右至左求最大子段和。
問題迎刃而解。
51nod1254 最大子段和 V2
n個整數組成的序列a 1 a 2 a 3 a n 你可以對陣列中的一對元素進行交換,並且交換後求a 1 至a n 的最大子段和,所能得到的結果是所有交換中最大的。當所給的整數均為負數時和為0。例如 將 4 和 4 交換,最大子段和為11 4 13 28。input 第1行 整數序列的長度n 2 n ...
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 還...