斜率優化 學習筆記

2022-03-26 10:28:03 字數 1584 閱讀 7769

前言:寒假yousiki講過斜率優化,但完全沒有聽懂。現在文化課解析幾何也學了不少,終於能做一些題了。

有時候我們列出dp方程會得到形如這樣的式子:

$f[i]=max/min+w[i](1\leq j我們變換一下形式:

$2*a[i]*b[j]+f[i]-a[i]^2-w[i]=f[j]+b[j]^2$

仔細一看,上面的等式可以化成$y=kx+b$的形式,即含$j$的項視為$x$和$y$,含$i$的項視為常數項。

根據這個式子,我們可以將轉移優化成$o(n)$的。

根據$y=kx+b$的形式,我們可以視為平面上有許多點,座標為$(b[j],f[j]+b[j]^2)$。這些點連起來可以形成乙個凸包。我們用單調佇列來維護這個凸包。

假設$k=2*a[i]>0$,即維護下凸包,斜率是單調遞增的。下面的講述可以用線性規劃來理解(人教版高中數學必修二)。

1.如果經過某兩點直線的斜率小於現在直線的斜率,那麼$head++$。因為我們現在的直線肯定是想經過凸包的邊界的,而現在的答案肯定不是最優。

2.現在的隊頭就是最優解。把$q[head]$帶到原方程中。

3.如果經過$q[tail]$和$q[tail-1]$的直線的斜率大於經過$q[tail-1]$和$i$的斜率,那麼$tail--$。因為凸包肯定是要囊括所有點的,不能讓有的點在凸包外面。

於是轉移被優化成$o(n)$的了。

怎麼樣?是不是很簡單?滑稽

其實學長教我們的時候推薦我們用叉積來判斷關係,因為會有些極端資料卡掉斜率(比如斜率不存在)。但大部分題都不卡斜率這種做法。

例題 【hnoi2008】玩具裝箱

題目鏈結

斜率優化入門題。

設$f[i]$表示考慮前$i$個玩具所花費的最小費用,很容易得出方程$f[i]=\min^i c[k])^2}$

字首和優化,變換一下形式:$f[i]=\min(f[j]+(sum[i]-sum[j]+i-j-1-l)^2)$

設$a[i]=sum[i]+i$,$b[i]=sum[i]+i+l+1$

則$f[i]=\min(f[j]+(a[i]-b[j])^2)$

化成$y=kx+b$的形式:$2*a[i]*b[j]+f[i]-a[i]^2=f[j]+b[j]^2$

然後斜率優化一下就可以了。

**:

#include#define int long long

using

namespace

std;

int dp[50005

],n,l,x;

double sum[50005

];int q[50005

],head,tail;

double a(int x)

double b(int x)

double x(int x)

double y(int x)

double slope(int i,int j)

signed main()

head=tail=1

;

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

printf(

"%lld

",dp[n]);

return0;

}

斜率優化學習筆記

目錄第二類斜率優化 注意事項 q a 例題 hnoi玩具裝箱 由題意我們可以馬上得到dp方程 dp i displaystyle min sum x 為字首和 很可惜,這個解法是 o n 2 的,無法ac 但是可以在當年騙很多分?接下來的文章中我們會用幾個簡稱 f i sum i i c 1 l 優...

斜率優化 學習筆記

事實上斜率優化是專門用來處理這樣一類 dp 式子的 dpi ai maxj 1i 1 bj cj basei 窩萌嘗試把上式中的 bj cj 和 basei 等價成 xj yj 和 ki 並把它們丟到乙個平面上,然後它萌就會變成一堆點 xj,yj 畫一條過他們的直線,類似於 y yj ki x xj...

斜率優化學習筆記

斜率優化是 dp 的一種有力優化方式。常用於處理當 dp 方程 f i max f j val i,j 中 val i,j 出現同時關於 i j 的項,而無法直接單調佇列優化的情況。考慮這麼乙個問題 顯然的 dp 問題。令 f i 為以 i 為某一段的結尾,前面總得分的最大值。顯然我們有狀態轉移方程...