最大連續和的不斷優化過程

2022-06-21 15:06:10 字數 1769 閱讀 3194

給出乙個長度為n的序列,求最大連續和

1、n3

#includeusing

namespace

std;

int f(int p, int

n) }

}return

ans;

}int

main()

cout

<< f(p, 0, n)

}

2、n2

記錄、遞推思想

int f(int p, int s, int n)

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

return ans;

}int main()

cout << f(p, s, n) << endl;

return 0;

}

3、nlogn

分治演算法一般分為以下3個步驟:

劃分問題:把問題的例項劃分成子問題。

遞迴求解:遞迴解決子問題。

合併問題:合併子問題的解得到原問題的解。

最大連續和的分治演算法:

1、把序列分成元素個數盡量相等的兩半;2、分別求出完全位於左半或者完全位於右半的最佳序列;3、求出起點位於左半、終點位於右半的最大連續和序列,並和子問題的最優解比較。

#includeusing

namespace

std;

int f(int a, int x, int y)//

返回在[x,y)中的最大連續和

int mid = x + (y - x) / 2, ans =a[x];

ans =max(ans, f(a, x, mid));

ans =max(ans, f(a, mid, y));

int l = a[mid - 1],r =a[mid];

for(int i = x; i < mid; i ++)

l =max(l, sum);

}for(int i = mid; i < y; i ++)

r =max(r, sum);

}ans = max(ans, l +r);

return

ans;

}int

main()

cout

<< f(p, 0, n)

}

該方法的2個細節:

1、左閉右開的「陣列分割」。使得處理自然。

2、(x+y)/2和x+(y-x)/2。數學上等價,在計算機中,前者是朝零取整,後者是朝區間起點取整。

4、n

在o(n2)演算法上稍作修改:當j確定時,「s[j]-s[i-1]最大」相當於「s[i-1]最小」,因此只需要掃瞄一次陣列,維護「目前遇到過的最小s」即可。

#includeusing

namespace

std;

int f(int p, int s, int

n)

int minn = s[1

];

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

return

ans;

}int

main()

cout

<< f(p, s, n)

}

最大連續和

這個問題對我來說還挺難的,當初做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 ...