狀態方程爲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]的時候,j1比j2更優,2*sum[i]>=s[j1,j2]的時候,j2比j1更優,由於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雖然是遞增的,但是不一定是連續的!