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