HDU 3507 Print Artical

 

狀態方程爲dp[i]=min{dp[j]+(sum[i]-sum[j])^2+m} ,0<=j<i

狀態轉移是O(n)的,總體複雜度爲O(n^2),對於n=500000顯然會超時

上網查了下,發現要用到斜率優化,找了些資料來看,理解了一下什麼是斜率優化

這個題我是用代數方法維護單調隊列的,幾何方法暫時還不會

首先,把方程變化一下

Dp[i]=min{dp[j]+sum[j]^2-2*sum[i]*sum[j]}+s[i]^2+m,把不影響決策j的放到括號外面

w[j,i]= dp[j]+sum[j]^2-2*sum[i]*sum[j],需要證明的是,對於j1<j2<i,若w[j1,i]>w[j2,i],那麼對於i’>i,w[j1,i’]>w[j2,i’],j1對之後的決策是沒用的

h(x)=dp[x]+sum[x]^2

w[j1,i]<w[j2,i],那麼h(j1)-2*sum[i]*sum[j1]<h(j2)-2*sum[i]*sum[j2]

(h(j1)-h(j2))/(sum[j1]-sum[j2])>2*sum[i]

這個表達式與w[j1,i]<w[j2,i]等價,

s[j1,j2]= (h(j1)-h(j2))/(sum[j1]-sum[j2]),2*sum[i]<s[j1,j2]的時候,j1j2更優,2*sum[i]>=s[j1,j2]的時候,j2j1更優,由於sum[i]是隨i單調遞增的,即i’>i時,sum[i’]>sum[i],即此後j2總是比j1更優,可以捨棄j1

於是,我們需要維護一個單調遞增的序列,j0<j1<j2<…2*sum[i]<s[j0,j1]<s[j1,j2]<…即最優性質是遞減的,隊頭總是最優的

當新加入一個點時,我們維護這個單調序列的單調性,如果要取對於點i的最優決策點,必須滿足2*sum[i]<s[j0,j1],否則,隊頭出隊,直到只剩一個點。需要注意的是j0,j1,j2雖然是遞增的,但是不一定是連續的!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章