DP優化方法之斜率DP

2022-08-13 09:18:12 字數 1360 閱讀 5120

什麼是斜率dp呢 大概就把一些單調的分組問題 從o(n^2)降到o(n) 具體的話我就不多說了 看**:

我自己也補充幾句:

其實斜率dp有很多種打法 有凸包 有截距 有直接比較斜率的 因為我比較弱 所以的話就學最弱智的比較斜率的 聽wph說截距很好理解

然後的話 講課的時候scy說什麼要證單調性什麼鬼的 我在學的過程中好像沒遇到就不管了 雖然我很弱 反正我能ac就行了

我們要知道的一點是我們要維護的是斜率遞增還是遞減的 這很重要 然後還要知道什麼時候左邊端點優 什麼時候右邊端點優

我做這種題就是 先列舉kx[i] 然後設兩條斜率為g[i,j] g[j,k]

看看g[i,j]g[j,k]的情況 看看有沒有使j最不優的情況刪掉j 然後描出這個佇列裡面合法的點 就知道是單調遞增還是遞減了

其實我說的很亂 別看好了 直接上例題

[usaco2008 mar]土地購買

首先這一道題是求max的 我們自然要辦法處理一下 先按x和y從小到大排序 我們發現 當i>j xi>xj yi>yj的時候 j是廢的 所以我們要重新搞一遍 使得xi>xj yi這樣就變成了x遞增y遞減的東西

然後斜率dp搞一下就好了 注意如果沒刪去那些沒用的直接搞會錯的 因為如果假設i>j i對於j來說j是廢的 那麼的話f[i]就是繼承f[j] 就是把i和j分成兩組 然後的話j又比j-1優(會有可能的好像我想了一下) 所以的話就繼承了j的使原來不優 但是的話j-1不優是因為y[j-1+1]的影響了 (想一下 我就因為這個wa了)

#include#include

#include

#include

#include

#include

#include

#define maxn 50010

using

namespace

std;

pair

pr[maxn]; int

n;bool cmp(const pair &x,const pair &y)

pair

s[maxn]; int top=0; int q[maxn],head,tail; double

f[maxn];

inline

double slop(int j,int k)

intmain()

head=1; tail=1; q[head]=0;

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

return printf("

%.0lf\n

",f[top]),0;}

/*4100 1

15 15

20 5

1 100

1<=n<=50000

*/

view code

斜率優化 DP

我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...

dp斜率優化

我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...

斜率優化DP

斜率優化主要解決的是轉移方程中存在乙個同時與i和j有關的部分時的優化問題 dp i min dp j a i b j 0 include using namespace std typedef long long ll const int maxn 1e5 5 ll a maxn b maxn dp...