什麼是斜率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#includeview code#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
*/
斜率優化 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...