1. 程式人生 > >BZOJ-3-1010: [HNOI2008]玩具裝箱toy

BZOJ-3-1010: [HNOI2008]玩具裝箱toy

dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j-1-L)^2) (j<i)

令f[i]=sum[i]+i,c=1+l

則dp[i]=min(dp[j]+(f[i]-f[j]-c)^2)

1.證明決策單調性

假設在狀態i處的k決策優與j決策,即

dp[k]+(f[i]-f[k]-c)^2<=dp[j]+(f[i]-f[j]-c)^2

則對於i後的所有狀態t,要證明決策單調性

即dp[k]+(f[t]-f[k]-c)^2<=dp[j]+(f[t]-f[j]-c)^2

只要證

dp[k]+(f[i]+v-f[k]-c)^2<=dp[j]+(f[i]+v-f[j]-c)^2

只要證

dp[k]+(f[i]-f[k]-c)^2+2*v*(f[i]-f[k]-c)+v^2<=dp[j]+(f[i]-f[j]-c)^2+2*v*(f[i]-f[j]-c)+v^2

只要證

2*v*(f[i]-f[k]-c)<=2*v*(f[i]-f[j]-c)

即f[k]>=f[j](顯然)

證明完畢

2.求斜率方程

因為dp[k]+(f[i]-f[k]-c)^2<=dp[j]+(f[i]-f[j]-c)^2

展開

dp[k]+f[i]^2-2*f[i]*(f[k]+c)+(f[k]+c)^2<=dp[j]+f[i]^2-2*f[i]*(f[j]+c)+(f[j]+c)^2

即

dp[k]-2*f[i]*(f[k]+c)+(f[k]+c)^2<=dp[j]-2*f[i]*(f[j]+c)+(f[j]+c)^2

即(dp[k]+(f[k]+c)^2-dp[j]-(f[j]+c)^2)/2*(f[k]-f[j])<=f[i]

f[i]是單調遞增的,我們使用佇列維護一個下凸殼,每次取出隊頭作為決策

加入決策i時,令隊尾為q[r],前一個為q[r-1]

滿足斜率(q[r],i)<斜率(q[r-1],q[r])時,顯然隊尾是無效的,將其彈出