單調佇列
單調佇列:佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。。
單調佇列的常用操作如下:
(1)插入:若新元素從隊尾插入後會破壞單調性,則刪除隊尾元素,直到插入後不再破壞單調性為止,再將其插入單調佇列。
(2)獲取最優(最大、最小)值:訪問首尾元素。
樸素演算法
這是乙個區間求極值問題。
先列舉起始元素ax,然後求ax到ax+k-1的最大(小)值。
我們得到了乙個複雜度為o(nk)的演算法。
優化方案
以最大值為例
對任意l<=i動態規劃·單調佇列的理解
做動態規劃時常常會見到形如這樣的轉移方程:
f[x] = max or min + w[x]
(其中b[x]隨x單調不降,即b[1]<=b[2]<=b[3]<=…<=b[n])
(g[k]表示乙個和k或f[k]有關的函式,w[x]表示乙個和x有關的函式)
這個方程怎樣求解呢?我們注意到這樣乙個性質:如果存在兩個數j, k,使得j <= k,而且g(k) <= g(j),則決策j是毫無用處的。因為根據b[x]單調的特性,如果j可以作為合法決策,那麼k一定可以作為合法決策,並且k是乙個比j要優的決策。因為k比j要優,(注意:在這個經典模型中,「優」是絕對的,是與當前正在計算的狀態無關的),所以,如果把待決策表中的決策按照k排序的話,則g(k)必然是不降的。在此例中決策表即f[x].
這樣,就引導我們使用乙個單調佇列來維護決策表。對於每乙個狀態f(x)來說,計算過程分為以下幾步:
1、 隊首元素出隊,直到隊首元素在給定的範圍中。
2、 此時,隊首元素就是狀態f(x)的最優決策,
3、 計算g(x),並將其插入到單調佇列的尾部,同時維持佇列的單調性(不斷地出隊,直到佇列單調為止)。
重複上述步驟直到所有的函式值均被計算出來。不難看出這樣的演算法均攤時間複雜度是o(1)的。因此求解f(x)的時間複雜度從o(n^2)降到了o(n)。
ACM課程心得
ios sync with stdio false 在c 中的輸入和輸出有兩種方式,一種是scanf和printf,另一種是cin和cout,這兩種方法看似,實則相差很大 一.首先,scanf與printf使用的標頭檔案是stdio.h cin與cout的標頭檔案是 iostream 二.兩者在效率...
ACM課程心得
課程上介紹到了記憶化搜尋 1.記憶化搜尋的實質是動態規劃,效率也和動態規劃接近,形式是搜尋,簡單直觀,也容易編寫,不需要進行什麼拓撲排序了。可以歸納為 記憶化搜尋 搜尋的形式 動態規劃的思想 在數塔例題中的應用 在求max 2,1 max 2,2 的時候兩次呼叫函式max 3,2 也就是說,函式ma...
ACM課程心得
搜尋 搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題解空間的部分或所有的可能情況,從而求出問題的解的一種方法。狀態 對問題往某乙個時刻進展情況的數學描述,或者是數學抽象。狀態轉移 動態規劃中本階段的狀態往往是上一階段狀態和上一階段決策的結果,在盡可能短的時間內找到最優化問題的全域性最優解或近似...