首先,推薦乙個大佬的部落格,講解非常詳細,所以不會斜率優化的請移步這裡,本部落格主要講題目分析qwq
主要講解題目:
1.[hnoi2008玩具裝箱]
2.[zjoi2007倉庫建設]
3.[usaco08mar土地徵用land acquisition]
4.[apio2010特別行動隊]
下面,開始吧。
題目分析:
/* 如何看出它是個斜率優化的題呢?
first:我們可以輕鬆的看出它是個dp
next:資料範圍對於 $o(n^2)$顯然不大友好
then: 怎麼辦呢? 肯定是得優化的,但怎麼優化,用什麼優化才是關鍵。*/
估計很多讀者(呃。。such as本人)想到這裡,直接的反應是:(算了,算了,不管了,寫個dp式子,拿個暴力分得了) 於是對於此題,經過一番分析後,我們可以發現,有好幾種方法列出狀態及轉移方程。
比如說$o(n^3)$的區間dp,讀者們是可以較輕鬆列出的,但是這樣的話,我們驚訝的發現:這玩意兒沒辦法優化,(寫的極其優美的情況下)才是$o(n^3)$的。 此種——只適合暴力。
再想想,有沒有$o(n^2)$的做法。
當然是有的,我們可以將狀態這樣設: $f[i]$ 表示裝到第$i$個玩具,最小的花費是多少。 這樣我們接下來可以直接列舉上乙個打包壓縮的位置$j$,用$f[j]$來更新我們的$f[i]$,時間複雜度$o(n^2)$。
方程是這樣的$f[i]=min$ 其中$sum$陣列維護的是題目中$c$陣列的字首和(為了計算費用方便)
$!!!$接下來的過程才是重頭戲,經過上面dalao部落格的學習後,我們知道了斜率優化這個東西,它的本質是要將上面的轉移方程轉化為 $y=kx+b$的形式,其中$b$就是我們要求的$f[i]$。(方便求)
於是,開始了漫長的導式子過程: (部分摘自上面那位的blog......)
我們可以知道,所有只和$i$有關的項,和常數項可以暫時拿掉(相當於放在$b$旁邊),最後再加,因為它是個定值,對答案沒有影響,而且在以後的相減過程中,都是可以消去的項(大家不妨可以保留後試一試,看看對答案是否有影響)。
然後呢,我們令 $s[x]=sum[x]+x$
上面那個式子就成了這樣: $f[i]=f[j]+s[i]^2+(s[j]-l)^2-2*s[i]*(s[j]-l)$
移項:$f[j]+s[i]^2+(s[j]+l)^2=2*s[i]*(s[j]+l)+f[i]$
省略式子(簡化):$f[j]+(s[j]+l)^2=2*s[i]*(s[j]+l)+f[i]$
然後這一坨 $f[j]+(s[j]+l)^2$ 就是 $y$ ,$2*s[i]$就是$k$,$f[i]$便是$b$,$s[j]$便是$x$(至於$l$為什麼可以拿掉,因為在維護上面的式子時,我們需要做差,這一過程後,我們發現,$l$消失了。。)。
finally:可以用斜率優化的一貫做法來解題了。 首先要看好,要維護的凸包是向上的,還是向下的。(用人話來說,就是看看這個題是維護最小的花費,還是最大的花費。)然後建個平面直角座標系,每個點的座標便是 $(s[j],f[j]+(s[j]+l)^2)$ ,然後。。在此就不贅述了,剩下的上面那篇部落格裡就都有了,而且也是些套路的問題。
$!!!$這裡有個比較重要的問題,就是我們一定一定要看好斜率$k$的符號,以便處理一些細節問題。
以下是**:
#include #include #include using namespace std;
const int n=50001;
int n, l;
long long s[n];
long long f[n];
long long q[n];
double f_x(int x)
double f_y(int x)
double f_k(int a,int b)
int main()
int head, tail;
head=tail=0;
for(int i=1;i<=n;i++)
s[i]+=i;
for(int i=1;i<=n;i++)
{while(head// 以下題均為略講,如有特殊需要注意的地方,會加重處理。
呃。。其實我最初分析這道題時,認為和上一道沒什麼兩樣。。。(其實真沒什麼兩樣),比較裸的概率dp,做起來,**看起來,都差不多。(未完待續。。。)
斜率優化總結
斜率優化是用於優化一些線性dp,主要思想類似於凸包。下面來看乙個例題 hdu 3507 由題意不難想到是dp,也很容易退出轉移過程f i m in f j s i s j 2 m i 0 i 1 但是一看 n 的範圍馬上就萎了,下面來看看用斜率怎麼優化。現將推出的轉移方程化簡 f i m in f ...
斜率優化總結
考慮如下 dp dp i max min a i b j c i d j j i 其中,a i c i 只與i有關,b j d j 只與j有關。括號裡有與i,j同時有關的項,導致單調佇列優化失效,但是如果這樣的項只有乙個可以採用斜率優化。方法如下 將此dp方程轉化為 dp i a i max min...
斜率優化總結
題目 luogu p2365 任務安排 題解 題解 p2365 任務安排 對於此類方程 f i begin f j val i,j end 暫時忽略min和範圍得 f i f j val i,j 整理得 f j val i,j f i 令 val i,j f i g j h i 則 f j f i ...