1. 程式人生 > >淺談帶權二分或者斜率凸優化

淺談帶權二分或者斜率凸優化

APOI講了這個東西,還有THU命題的《九省·林克卡特樹》,感覺好像很熱點的樣子。

帶權二分是一類對DP的優化,對於某些最優化問題的(2d/yd)DP,通過這種優化,其效率可以達到簡化後的(1d/yd)DP的效率乘一個log

((xd/yd)DP是指狀態數為n^x級且每種狀態的轉移數為$n^y$級的DP,這個形式下的DP的最好效率是$n^{x+y}$的)

有這麼一個(2d/yd)DP:

——對於某狀態二元組(i,j),有最優值f[i][j];

——每個f[i][j]的得出,都需要比較$n^y$個其他的狀態二元組,從中挑出一個可以使f[i][j]更優的狀態作為前驅來進行轉移;

——需要某一個f[n][m]的結果(因為n和m同級,所以可以認為狀態數為$n^2$級)。

考慮優化這個(2d/yd)DP,也就是把它降為一個其他的(x'd/y'd)DP使得x'+y'<2+y

考慮使y減小——

由於在此類DP中,每一個狀態的得出,最終只需要從所有備選的前驅中挑一個來進行轉移,

於是在最理想的情況(也就是經過各種神奇優化之後),我們可以不經過比較一步找到每個狀態的前驅

這樣就是一個(2d/0d)的DP了,效率$O(n^2)$,

對於決策過程的優化就到此為止了,這一部分並不是本文的重點,所以可以看出,他被一筆帶過了。

現在我們考慮優化狀態數,也就是把2d變成1d——

考慮有一個(2d/yd)DP,我們要得到的是狀態(n,m)的最值f[n][m]

如果這個DP沒有第二位限制的話是一個非常好搞的1dDP(狀態為x時,其答案f'[x]為原來f[x][i]中i列舉所有值時的最優值,由於DP狀態的精確性有所下降,所以一般情況下f'的DP的確可以是一個(1d/y'd)DP,而且y'<=y,也就是一個比之前更好搞的DP)

那我們儘量希望把第二位消掉,以優化狀態數

設有函式F滿足F(i)=f[n][i];

F在整點處的最值,也是對於所有i而言f[n][i]的最值;

那麼設這個值為f'[n],可以發現f'[n]就是我們上文中所說的消去第二位限制後出現的那個很好搞的DP

然而,這樣得到的f'[n]=f[n][x],卻並不能保證x=m。

考慮給F搭配另一個函式G以得到函式H,使得H(x)=F(x)+G(x)

且H(x)在x=m時取得整點處的最值;

這樣的話,設這個最值為h'[n],如果h'[n]也恰好是個很好搞的(1d/y''d)DP(這需要G十分恰當),那麼h'[n]就可以是我們優化狀態數的產物。而最終的答案就是h'[n]-G(m)了

帶權二分(斜率凸優化)就是上述討論的一個簡單易行而應用廣泛的特例。

比如有f[a][b]=max(列舉c){f[a-1][c]+val[c+1,b]},

由之前的定義有$F_{max}$=f'[n]=max(列舉i){f[n][i]}

可以發現f'[x]是一個很好搞的DP——

f'[b]=max(列舉c){f'[c]+val[c+1,b]}

如果F的曲線滿足如下圖的凸性:

比如F(x)是下圖這樣的曲線

那麼只要H(x)是F(x)搭配不同斜率的正比例函式G(x)(即H(x)=F(x)+K*x,其中G(x)=K*x),就可以使不同的x變成H(x)取到最值的地方

而且h'[x]也是一個很好搞的DP——

當G的斜率為K時,h'[b]=max(列舉c){h'[c]+val[c+1,b]+K}

(每轉移一次就相當於原來的f中第二位+1,這意味著G的自變數+1,此時G對h'多貢獻了K)

於是剩下的問題就是如何找到一個合適的K,使得H的最優值h'[n]在m處取得了

因為只要K合適,那麼答案就是f[n][m]=h'[n]-m*K,而h'是一個很好搞的DP,於是此類題目就結了。

我們發現由於F函式曲線的凸性,當K逐漸減小時,H的最值取得的位置逐漸右移,

這意味著K可以二分取得:

每次二分一個K’,DP計算當前的h'[n],並計算當前h'[n]=H(x)的這個x是那一個x

如果這個x>m就blabla

如果這個x<m就blabla

這樣最後會得到了一個合適的K,並同時也就得到問題的答案了。

而對於F的曲線滿足如下圖凸性的情況:

我們可以用同樣的方法,搭配不同斜率的正比例函式G(x)使得H(x)的min值在不同的x處取得。

方法之前的類似。

總結:

對於f[n][m]

如果f[n][m]求解max值

且設F(x)=f[n][x],有F(x)是隨x增加,斜率遞減的函式

那麼我們可以通過斜率凸優化解決這個問題

如果f[n][m]求解min值

且設F(x)=f[n][x],有F(x)是隨x增加,斜率增的函式

那麼我們可以通過斜率凸優化解決這個問題

例子:

有如下DP方程——

$$f_{[i][j]}=MIN_{k∈[0,j-1]}f_{[i-1][k]}+(sum_{l=k+1}^{j}a[l])^2$$

$$且對於所有i>j,有f_{[i][j]}=INF$$

其中a[x]為輸入資料

求解$f_{[m][n]}$

可以看出$f_{[m][n]}$為把n個數分成m段,求每段和的平方的和。

設$F(x)=f{[x][n]}$可以證明F(x)是一個隨x增加,斜率增的函式。

如果沒有m段的限制的話

有$f'_{[j]}=MIN_{k∈[0,j-1]}f_{[k]}+(sum_{l=k+1}^{j}a[l])^2$

通過預處理字首和以及一些斜率優化技巧,這個方程可以做到O(n)

如果我們給每次劃分搭配一個費用K的話

就有$h'_{[j]}=MIN_{k∈[0,j-1]}h_{[k]}+(sum_{l=k+1}^{j}a[l])^2+K$

同樣可以斜率優化做到O(n),

這樣,我們二分K,判定此時$h'_{[n]}$對應的劃分次數與m的關係,從而找的一個合適的K,進而找的問題的答案。

最終效率為O(nlogV)

相關推薦

二分或者斜率優化

APOI講了這個東西,還有THU命題的《九省·林克卡特樹》,感覺好像很熱點的樣子。 帶權二分是一類對DP的優化,對於某些最優化問題的(2d/yd)DP,通過這種優化,其效率可以達到簡化後的(1d/yd)DP的效率乘一個log ((xd/yd)DP是指狀態數為n^x級且每種狀態的轉移數為$n^y$級的DP,

隱藏

系統運維;雲計算;Linux;隱藏權限的功能之一:防止root誤刪除和修改文件及目錄。此權限用ll和ls -l查不出來。 隱藏權限查看lsattr 文件名例: lsattr /etc/hosts 文件沒有隱藏權限 常見的隱藏權限有2個i權限:只可以查看文件內容,但不能刪除文件和修改內容a權限:可

Codeforces.739E.Gosha is hunting(DP 二分)

void lse () algorithm 進行 總結 include line lin 題目鏈接 \(Description\) 有n只精靈,兩種精靈球,每種球能捕捉到第i只精靈的概率已知。求用A個低級球和B個高級球能捕捉到精靈數的最大期望。 \(Solution\) 設

[2018.6.23集訓]y-二分

read () stderr print define top 有時 方法 spa 題目大意 幾乎同HNOI2018道路,但將題面中的"小 W 決定對每個城市翻修恰好一條通向它的道路,即從公路和鐵路中選擇一條並進行翻修"這句話刪去,即改為可以任意選擇$n

odoo

規則 通用 操作 write man 普通 文件 添加 group 首先引用博主<郭歡歡>整理的一篇文章<Odoo權限機制> 然後在此基礎上,自己也研究了一番,有一定的收獲。 先整理如下: <場景一:安裝模塊後,只有admin(管理員)能

UVA1349(二分圖最大匹配 --> KM算法模板)

amp slack == 還需要 構造 有一個 using lac str UVA1349 題意:給定一些有向帶權邊,求出把這些邊構造成一個個環,總權值最小 解法: 對於帶權的二分圖的匹配問題可以用通過KM算法求解。 要求最大權匹配就是初始化g[i][j]為0,直接跑就可以

[NOI2012]美食節——費用流(二分圖匹配)+動態加邊

最大 set sin 最短路 最大流 pre 可能 題目 不同 題目描述 小M發現,美食節共有n種不同的菜品。每次點餐,每個同學可以選擇其中的一個菜品。總共有m個廚師來制作這些菜品。當所有的同學點餐結束後,菜品的制作任務就會分配給每個廚師。然後每個廚師就會同時開始做菜。廚師

[LOJ#2478][九省聯考2018]林克卡特樹(樹形DP+二分

Address 洛谷P4383 BZOJ5252 LOJ#2478 Solution 簡版題意:在一棵 n n

HDU2255 奔小康賺大錢 (二分圖最優匹配) 模板題【KM演算法】

<題目連結>               奔小康賺大錢 Problem Description 傳 說在遙遠的地方有一個非常富裕的村落,有一天,村長決定進行制度改革:重新分配房子。 這可是一件大事,關係到人民的住房問題啊。村裡共有n間房間,剛好有n家老百姓,考慮到每家都要有

二分

邊界條件 例題 efi 決策單調 http 二分 content sort desc 帶權二分 一種二分答案的套路,又叫做DP凸優化,wqs二分。 用來解決一類題目,要求某個要求出現K次,並且,可以很顯然的發現,在改變相應權值的時候,對應出現的次數具有單調性。而且很顯然

E-room (km) 二分

題目描述 Nowcoder University has 4n students and n dormitories ( Four students per dormitory). Students numbered from 1 to 4n. And in the

HDU 1853 & HDU 3488【有向環最小值覆蓋問題 】二分圖匹配 KM演算法

In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way roads connecting them. You are lucky

二分圖的最佳匹配(KM演算法)

還是沒看懂一般圖都是最大匹配問題。。怪我太笨了哎~ 先來個看明白了的KM演算法——尋找帶權二分圖的最佳匹配方法 一般對KM演算法的描述,基本上可以概括成以下幾個步驟: (1) 初始化可行標杆 (2) 用匈牙利演算法尋找完備匹配 (3) 若未找到完備匹配則修改可行標杆 (4)

KM演算法求二分圖的最大匹配(完備匹配)

1.基礎知識普及 二分圖的概念 二分圖又稱作二部圖,是圖論中的一種特殊 模型。 設G=(V,{R})是一個無向圖。如頂點集V可分 割為兩個互不相交的子集,並且圖中每條邊 依附的兩個頂點都分屬兩個不同的子集。則圖G成為二分圖。 通俗來講,二分圖指的是這樣一種

二分圖匹配KM演算法

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int IN

二分圖最大匹配 P1500

author ges double its 一個 rip const 方式 empty 帶權二分圖最大匹配 P1500 普通的二分圖最大匹配的權值都是1,但是現在我們要解決帶權的。 解決方法有兩個:一個是匈牙利算法但是不會,另一個是最大費用最大流。 建圖方式是這個樣子:

二分匹配——KM演算法

上一篇中,我們講到如果不帶有權值,單純尋找最大匹配數的話,匈牙利演算法完全可以滿足,可是,許多問題中,通過帶權值我們可以找到最大或者最小化策略,這樣的問題,我們就要用到KM演算法。 先貼一道模板題: 奔小康賺大錢 傳說在遙遠的地方有一個非常富裕的村落,有

二分圖的最優匹配 Kuhn-Munkres演算法

分工問題如下:某公司有工作人員x1,x2,...,xn,他們去做工作y1,y2,...,yn,每人適合做其中的一項或幾項工作,每個人做不同的工作的效益不一樣,我們需要制定一個分工方案,使公司的總效益最大,這就是所謂最佳分配問題, 它們數學模型如下: 數學模型:    G是加權完全二分圖,V(G)的二分圖

LibreOJ #2478.「九省聯考 2018」林克卡特樹 樹形dp+二分

題意 給出一棵n個節點的樹和k,邊有邊權,要求先從樹中選k條邊,然後把這k條邊刪掉,再加入k條邊權為0的邊,滿足操作完後的圖仍然是一棵樹。問新樹的帶權直徑最大是多少。 n,k≤3∗105n,k≤3∗105 分析 不難發現我們要求的就是在樹中選出k+1

二分-一丟丟感悟

lse pda 不同 code 可能 math upd 邊界條件 update 問題:邊界條件的考慮方式,權值相等時,第二關鍵字應該是最大化還是最小化。 用 hzwer 的選 \(k\) 個白點那道題來說吧,給每個白點增加 \(mid\) 的權值,計算 MST 的白點數量