最大子段求和

2021-08-05 18:25:25 字數 1356 閱讀 4464

#includeusing namespace std;  

int main()

if(temp<0) //捨棄之前的子段

} cout《舉個例子,a[4]=; 顯然最大子段和是 9+2=11;

該**從頭到尾掃瞄一次,如果只有一項,則最大子段和是它本身,不管是否為負數還是正數。

假設第二項為正數的話,顯然最大子段和就是第二項本身了,該怎樣解決了呢,這樣想,因為這是求連續子段和,倘若該項的前n-1項連續子段和為負數,則最大子段和max就會改變,因為乙個數加上乙個負數,值會減小。所以當前n-1項連續子段和為負數時,就捨棄這一段,從頭開始。但注意,最大連續子段和中的元素可以允許有負數的存在,此時就需要設定乙個max來儲存最大值的情況,如果增加,則更新max的情況,否則不更新。

例題:題目描述

一天,ykc在學校閒的無聊,於是決定上街買點吃的,ykc很懶,本來就不是很像逛街,於是找來了czl幫他買,這裡應該有滑稽,而czl也不願為ykc買東西吃,但是ykc很強勢,非讓他去買,呢沒辦法了,然而czl還有很多事要做,沒呢麼多時間幫ykc,而這條小吃街又很長,有n家店,n有50000這麼大,並且這n家店的商品價值有所不同(要知道,商品的價值可能為負,哈哈,很神奇吧,但是czl肯定不會傻到賠錢,所以***),哇,czl要瘋了,他不想逛這麼久啊,他還有個毛病,他只會連續的逛若干家店,並且由於這條街的店很多,所以肯定不會是一條直線,換句話說就是首尾相連,即第n家店和第一家店是連在一起的,然而ykc希望czl買的東西價值最大,不然就會不開心,於是他就把艱難的任務交給你了,他真的不想浪費時間,你能幫助他嗎?

輸入第1行:小吃街的長度n(2 <= n <= 50000)

第2 - n+1行:n個整數,代表每個店的商品價值 (-10^9 <= s[i] <= 10^9)

輸出czl能買到的最大價值

樣例輸入6

-2 11 -4 13 5 -2

樣例輸出
25
/*題目思路:

和最大連續欄位和幾乎一樣,因為是環,所以多了頭尾相加的情況,

為了使得頭加尾最大,呢就再求乙個最小連續欄位和就好啦*/

#include#include#include#includeusing namespace std;

typedef long long ll;

#define maxn 50005

ll a[maxn],b[maxn];

int main(void)

for(i=1;i<=n;i++)

printf("%lld\n",ans);

return 0;

}

演算法分析之最大子段求和(一)

給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。當所有整數均為負值時定義其最大子段和為0。所求的最優值為 例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 分治方法求解 從問題的解的結構可以看出,它適合於用分治策略求解 如果將所給...

最大子段和

設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...

最大子段和

問題表述 n個數 可能是負數 組成的序列a1,a2,an.求該序列 例如 序列 2,11,4,13,5,2 最大子段和 11 4 13 20。1 窮舉演算法 o n3 o n2 2 分治法 將序列a 1 n 從n 2處截成兩段 a 1 n 2 a n 2 1 n 例項 三 最大子段和 問題表述 n個...