用一般暴力方法:
best = a[i]//初始化最大值
for(int i = 1;i <= n;i++)
for(int j = i;j <= n;j++)
優化時間複雜度為
s[0]=0;//s存字首和
for(int i = 1; i <= n; i++)s[i]=s[i-1]+a[i];
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
best = max(best, s[j]-s[i-1]);
分治法使時間複雜度更優
int maxum(int *a,int x,int y)//返回陣列在[x,y)區間中最大連續和
)" class="mathcode" src=""/>
的**加以改進,在的到s後對陣列進行維護,得到s的前i項最小,在後面的是s[j]-s[i-1]中只要找到最小的s[i-1]就ok了,所以只要直接減去維護後的s[i-1]就可以了。
最大連續和
這個問題對我來說還挺難的,當初做dp時水過去了,但沒徹底理解,這次打算好好分析一下,爭取徹底搞懂。首先,像 1 1 2 2 3 3 4 4 5 5這樣的數列,想要找連續最大和,可以有很多種方法,從最慢的列舉o n 3 到最快的動態規劃o n 毫無疑問,我們要選擇複雜度低的演算法。所以我這裡就只分析兩...
最大連續和
求陣列中數的最大連續和,如 1,1,1,1,1 最大連續和為3 一 動態規劃 當我們從頭到尾遍歷這個陣列的時候,對於陣列裡的乙個整數,它有幾種選擇呢?它只有兩種選擇 1 加入之前的subarray 2.自己另起乙個subarray。那什麼時候會出現這兩種情況呢?設狀態為f j 表示以s j 結尾的最...
最大連續和
給出乙個長度為n的序列a1,a2,an,求最大連續和 使用列舉 時間複雜度o n 3 best a 1 初始最大值 for int i 1 i n i 設si a1 a2 ai,則ai ai 1 aj sj si 1 連續子串行的和等於兩個字首之差 時間複雜度o n 2 s 0 0 for int ...