[kuangbin带你飞]专题二十 斜率DP

2018-01-27 13:34:33


A

裸题,不写了

B$~~$hdu 2829

设$dp[i][j]$为前$i$个点分$j$段的最小值

设$val[i][j]$为$[i,j]$的点为一段时的值,$val[i]$表示$val[1][i]$

$sum[i]$为前缀和

$$val[i][j]=val[j]-val[i-1]+sum[i-1] \cdot (sum[j]-sum[j-1])$$

dp方程:

$$dp[i][j]=min(dp[k][j-1]+val[k+1][i])\qquad (k<i)$$

$$\Rightarrow dp[i][j]=dp[k][j-1]+val[i]-val[k]-sum[k] \cdot (sum[i]-sum[k])$$

$$\Rightarrow sum[i] \cdot sum[k]+dp[i][j]-val[i]=dp[k][j-1]-val[k]+sum[k]^2$$

$x=sum[k]$,$y=dp[k][j-1]-val[k]+sum[k]^2$,斜率$sum[i]$单调递增,求截距$dp[i][j]-val[i]$最小值

根据$j$分别维护凸包即可

C$~~$hdu 4528

D$~~$poj 1260

设$dp[i]$为满足前$i$种珍珠需求最小费用

设$sum[i]$为所需珍珠数量的前缀和

dp方程:

$$dp[i]=min(dp[j]+(sum[i]-sum[j]+10) \cdot p[i])\qquad (j<i)$$

$$\Rightarrow p[i] \cdot sum[j]+dp[i]-(sum[i]+10) \cdot p[i]=dp[j]$$

$x=sum[j]$,$y=dp[j]$,斜率$p[i]$单调递增,求截距$dp[i]-(sum[i]+10) \cdot p[i]$最小值

E$~~$hdu 2993

F$~~$hdu 3669

以$w$为第一关键字,$h$为第二关键字降序排列

设$i<j$,则一定有$w[j]<=w[i]$

若$h[j]<=h[i]$则一定能过,直接去掉

则剩下的序列满足$w$单调递减,$h$单调递增

对于一个后面的人$i$,要么重新开一个洞,要么将之前的一个洞加高到$h[i]$

如果是加高,一定加高最后一个洞,证明如下:

$\qquad$设最后一个洞为$w[i] \cdot h[i]$

$\qquad$那么对于任意$j<i$,都有$w[j]>w[i]$且$h[j]<h[i]$

$\qquad$则加高到$h[k]$时必有费用$w[i] \cdot (h[k]-h[i])<w[j] \cdot (h[k]-h[j])$,即$i$更优

也就是说,序列中的连续一段必定是开同一个洞的

这就将原问题转化为分组问题:将一个序列分为最多$K$组,$[i,j]$分为一组的代价为$w[i] \cdot h[j]$,求最小代价

设$dp[i][j]$为前$i$个人分$j$组的最小代价,dp方程:

$$dp[i][j]=min(dp[k][j-1]+w[k+1] \cdot h[i]) \qquad (k<i)$$

$$\Rightarrow h[i] \cdot w[k+1]-dp[i][j]=dp[k][j-1]$$

斜率优化即可

G$~~$hdu 3045

先从小到大排序

易知分在一组的都是连续一段

于是得到dp方程:

$$dp[i]=min(dp[j-1]+(sum[i]-sum[j-1])-a[j] \cdot (i-j+1)) \qquad (T \leq i \leq n,j \leq i-T)$$

斜率优化即可

H$~~$hdu 3516

I$~~$poj 1160

设$dis[i][j]$为$[V_i,V_j]$上建一个邮局的最小距离和

画图容易知道,这个邮局应该建在$V_{(i+j)/2}$的位置最优(其中$i+j$为奇数时建在$V_{(i+j)/2}$和$V_{(i+j)/2+1}$效果相同)

易知$dis[i][i]=0$

从$dis[i][j-1]$推$dis[i][j]$时,可视为将原邮局移动到新的位置,并加上$V_j$到新邮局的距离

可以推出移动邮局对原来各村庄影响的和为0(因为比较简单所以不作证明),因此有

$$dis[i][j]=dis[i][j-1]+x[j]-x[(i+j)/2]$$

可以$O(n^2)$预处理出$dis$

设$dp[i][j]$为前$i$个村庄设置$j$个邮局的最小距离和,dp方程:

$$dp[i][j]=min(dp[k][j-1]+dis[k+1][i]) \qquad (k<i)$$

边界条件$dp[i][1]=dis[1][i]$

时间复杂度$O(V^2P)$,对于本题不优化也可以过

J$~~$poj 1180

设$dp[i][j]$为前$i$个任务分$j$组的最小代价,dp方程:

$$dp[i][j]=min(dp[k][j-1]+(t+sumT[i]-sumT[k]) \cdot (sumF[i]-sumF[k])) \qquad (k<i)$$

其中$t=s \cdot (j-1)+sumT[k]$

斜率优化后时空复杂度都是$O(n^2)$,但本题$n=10000$,显然过不了

观察到之前用到$j$这一维是因为前面的分组数有后效性

于是反过来,设$dp[i]$为$[i,n]$的任务的最小代价,得到dp方程:

$$dp[i]=min(dp[j]+(s+sumT[j-1]-sumT[i-1]) \cdot (sumF[n]-sumF[i-1])) \qquad (i<j)$$

斜率优化后时空复杂度$O(n)$,符合要求

K$~~$poj 2841

L

重复题目

J$~~$uva 12594