HDU 3507 斜率优化入学习
【題目鏈接】 點(diǎn)擊打開(kāi)鏈接
【題意】大概題意就是要輸出N個(gè)數(shù)字a[N],輸出的時(shí)候可以連續(xù)的輸出,每連續(xù)輸出一串,它的費(fèi)用是 “這串?dāng)?shù)字和的平方加上一個(gè)常數(shù)M”。
【寫(xiě)在前面】 思想?yún)⒖糂LOG : 點(diǎn)擊打開(kāi)鏈接
【解題方法】斜率優(yōu)化, 做這個(gè)題之前還不知道什么叫斜率優(yōu)化,或許是有了單調(diào)隊(duì)列的理解基礎(chǔ),一看就懂了。現(xiàn)在把我的理解和推導(dǎo)寫(xiě)下來(lái),供大家交流。
首先, 比較容易想到一個(gè)很樸素的方程 : 我們?cè)O(shè) DP[i]表示輸出到i時(shí)的 最小花費(fèi), 那么 sum[i] = 1到i的數(shù)字之和, 那么我們可以容易的列出來(lái)一個(gè)式子,
DP[i] = DP[j] + M + (sum[i] - sum[j]) ^ 2.然后顯然這是一個(gè)二維的DP。題目數(shù)據(jù)為500000, 顯然是不能通過(guò)此題的。那么考慮如何優(yōu)化呢?
我們還是從上面的式子著手,我們我們假設(shè)k<j<i。如果在j的時(shí)候決策要比在k的時(shí)候決策好,那么也是就是dp[j]+M+(sum[i]-sum[j])^2<dp[k]+M+(sum[i]-sum[k])^2。
(因?yàn)槭亲钚』ㄙM(fèi)嘛,所以優(yōu)就是小于)。
然后我們化簡(jiǎn)并移項(xiàng)得到 : DP[j] + Sum[j] ^ 2 - (DP[k] + Sum[k] ^ 2) / (2 * (Sum[j] - Sum[k])) < Sum[i]。 我們觀察一下左邊的式子,是不是就是
(yj - yk) / (xj - xk) ,這個(gè)形式難道不就是斜率的形式嗎? 前面我們假設(shè)了 在 j的決策比在k的決策要好, 那么就是滿足 (yj - yk) / (xj - xk) < Sum[i]時(shí),j比k決策好。
然后斜率優(yōu)化最關(guān)鍵的部分來(lái)了:(先說(shuō)下,下面的g[i, j]代表的是斜率)現(xiàn)在從左到右,還是設(shè)k<j<i,如果g[i,j]<g[j,k],那么j點(diǎn)便永遠(yuǎn)不可能成為最優(yōu)解,可以直接將它踢出我們的最優(yōu)解集。為什么呢?
我們假設(shè)g[i,j]<sum[i],那么就是說(shuō)i點(diǎn)要比j點(diǎn)優(yōu),排除j點(diǎn)。如果g[i,j]>=sum[i],那么j點(diǎn)此時(shí)是比i點(diǎn)要更優(yōu),但是同時(shí)g[j,k]>g[i,j]>sum[i]。這說(shuō)明還有k點(diǎn)會(huì)比j點(diǎn)更優(yōu),同樣排除j點(diǎn)。
排除多余的點(diǎn),這便是一種優(yōu)化!即是點(diǎn)的優(yōu)化,以前聽(tīng)說(shuō)過(guò)一個(gè)點(diǎn)優(yōu)化不知道是不是說(shuō)的斜率優(yōu)化。
那么有了這個(gè)性質(zhì)之后最優(yōu)解如何尋找呢? 還是設(shè)k<j<i。由于我們排除了g[i,j]<g[j,k]的情況,所以整個(gè)有效點(diǎn)集呈現(xiàn)一種上凸性質(zhì),即k j的斜率要大于j i的斜率。
也即是這個(gè)圖:
這樣,從左到右,斜率之間就是單調(diào)遞減的了。當(dāng)我們的最優(yōu)解取得在j點(diǎn)的時(shí)候,那么k點(diǎn)不可能再取得比j點(diǎn)更優(yōu)的解了,于是k點(diǎn)也可以排除。換句話說(shuō),j點(diǎn)之前的點(diǎn)全部
不可能再比j點(diǎn)更優(yōu)了,可以全部從解集中排除。
我們代碼實(shí)現(xiàn)怎么寫(xiě)呢?
1,用一個(gè)單調(diào)隊(duì)列來(lái)維護(hù)解集。
2,假設(shè)隊(duì)列中從頭到尾已經(jīng)有元素a b c。那么當(dāng)d要入隊(duì)的時(shí)候,我們維護(hù)隊(duì)列的上凸性質(zhì),即如果g[d,c]<g[c,b],那么就將c點(diǎn)刪除。直到找到g[d,x]>=g[x,y]為止,并將d點(diǎn)加入在該位置中。
3,求解時(shí)候,從隊(duì)頭開(kāi)始,如果已有元素a b c,當(dāng)i點(diǎn)要求解時(shí),如果g[b,a]<sum[i],那么說(shuō)明b點(diǎn)比a點(diǎn)更優(yōu),a點(diǎn)可以排除,于是a出隊(duì)。最后dp[i]=getDp(q[head])。
這個(gè)題雖然采用了斜率優(yōu)化,但是還是有區(qū)別的在于,sum[i]并不是單調(diào)遞增的,也有可能兩個(gè)點(diǎn)的 x坐標(biāo)是相同的,這就是為什么下面的斜率優(yōu)化會(huì)用 <= 和 >= 的原因,
這個(gè)=一定不能缺,缺了欽定WA。
總結(jié)
以上是生活随笔為你收集整理的HDU 3507 斜率优化入学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 双卡双待 资料
- 下一篇: 字符串-Manacher算法(你知道马拉