斜率优化(DP)
先來(lái)個(gè)華麗的出場(chǎng)~~
今天,蒟蒻仍在趕知識(shí)點(diǎn)的路上。昨天剛學(xué)過數(shù)位DP,今天又學(xué)了斜率優(yōu)化,被爆錘了。
不扯淡了,現(xiàn)在就來(lái)寫一下總結(jié)吧。
斜率優(yōu)化,既然叫這個(gè)名字,那么,這個(gè)算法的性質(zhì)其實(shí)就已經(jīng)確定了:DP優(yōu)化。
也就是說(shuō),它本身并不像樹形DP或數(shù)位DP那樣解決一些特定性質(zhì)的問題的,而是類似于矩陣乘法那樣,對(duì)于某些DP方程,加速地進(jìn)行轉(zhuǎn)移,以用來(lái)攻克一些給出的n較大時(shí)的情況。
學(xué)了斜率DP,你會(huì)發(fā)現(xiàn),自己學(xué)了多年的數(shù)學(xué)終于!!!在此刻派上了用場(chǎng)。斜率DP,顧名思義,與平面幾何,也就是我們所學(xué)的一次函數(shù)有關(guān)。斜率優(yōu)化往往是用于一些具有遞推性質(zhì)的DP方程中去的。
如:
本題就是一道典型的斜率優(yōu)化問題。首先,在寫斜率優(yōu)化題目的時(shí)候,最重要的一步并非優(yōu)化,而是想出DP轉(zhuǎn)移方程。優(yōu)化可以沒有,但沒有轉(zhuǎn)移方程,一定不行。
就如本題,若n的范圍夠小的話,我們可以雙重循環(huán)枚舉來(lái)搞。開一個(gè)f數(shù)組,f[i]f[i]f[i]表示將前iii個(gè)任務(wù)分組后的最小總費(fèi)用。求f[i]f[i]f[i],我們枚舉j(1?(i?1))j( 1-(i-1) )j(1?(i?1)),將j?ij-ij?i分為一組,求最小總費(fèi)用。
但是,很顯然,本題的nnn太大了,O(n2)O(n^2)O(n2)肯定過不去,這時(shí),就要考慮斜率優(yōu)化了。
考慮一下f[i]f[i]f[i]的表達(dá)式:f[i]=f[j]+(sumc[i]?sumc[j])?sumt[i]+s?(sumc[n]?sumc[j])f[i]=f[j]+(sumc[i]-sumc[j])*sumt[i]+s*(sumc[n]-sumc[j])f[i]=f[j]+(sumc[i]?sumc[j])?sumt[i]+s?(sumc[n]?sumc[j]),將其展開,化為y=kx+by=kx+by=kx+b的形式:f[j]=(sumt[i]+s)?sumc[j]+f[i]?sumc[i]?sumt[i]?s?sumc[n]f[j]=(sumt[i]+s)*sumc[j]+f[i]-sumc[i]*sumt[i]-s*sumc[n]f[j]=(sumt[i]+s)?sumc[j]+f[i]?sumc[i]?sumt[i]?s?sumc[n],如式子,我們將sumc[j]sumc[j]sumc[j]視為一次函數(shù)中的xxx,(sumt[i]+sumc[j])(sumt[i]+sumc[j])(sumt[i]+sumc[j])視為kkk,f[j]f[j]f[j]視為yyy,f[i]?sumc[i]?sumt[i]?s?sumc[n]f[i]-sumc[i]*sumt[i]-s*sumc[n]f[i]?sumc[i]?sumt[i]?s?sumc[n]視為bbb,那么,斜率相同的情況下,為使f[i]f[i]f[i]取minminmin,我們就要在(sumc[j],f[j])(sumc[j],f[j])(sumc[j],f[j])的點(diǎn)集中找到使這條直線從下向上找,找到的第一個(gè)點(diǎn)便是所需的jjj。
如圖:
對(duì)于任一條斜率大于0的直線,先找到的一定都是圖中的粉色的點(diǎn),而這三點(diǎn)則恰好構(gòu)成了本圖的一個(gè)凸包,所以,我們?cè)谡尹c(diǎn)時(shí),實(shí)際上只需維護(hù)凸包即可,又因本題的sumc[i](也就是一次函數(shù)的k)sumc[i](也就是一次函數(shù)的k)sumc[i](也就是一次函數(shù)的k)是單調(diào)遞增的,所以,我們可以將凸包中斜率小于當(dāng)前的sumc[i]sumc[i]sumc[i]的點(diǎn)刪去,這就是本題的大致思路了。
代碼如下:
好了,本次的博客就更新到這里。
總結(jié)
- 上一篇: 机器学习之朴素贝叶斯实现垃圾邮件过滤
- 下一篇: 多媒体计算机的概念是,多媒体计算机的基本