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

A

裸题,不写了

B        hdu 2829

dp[i][j] d p [ i ] [ j ] 为前 i i 个点分j段的最小值

val[i][j] v a l [ i ] [ j ] [i,j] [ i , j ] 的点为一段时的值, val[i] v a l [ i ] 表示 val[1][i] v a l [ 1 ] [ i ]

sum[i] s u m [ i ] 为前缀和

val[i][j]=val[j]val[i1]+sum[i1](sum[j]sum[j1]) v a l [ i ] [ j ] = v a l [ j ] − v a l [ i − 1 ] + s u m [ i − 1 ] ⋅ ( s u m [ j ] − s u m [ j − 1 ] )

dp方程:

dp[i][j]=min(dp[k][j1]+val[k+1][i])(k<i) d p [ i ] [ j ] = m i n ( d p [ k ] [ j − 1 ] + v a l [ k + 1 ] [ i ] ) ( k < i )

dp[i][j]=dp[k][j1]+val[i]val[k]sum[k](sum[i]sum[k]) ⇒ d p [ i ] [ j ] = d p [ k ] [ j − 1 ] + v a l [ i ] − v a l [ k ] − s u m [ k ] ⋅ ( s u m [ i ] − s u m [ k ] )

sum[i]sum[k]+dp[i][j]val[i]=dp[k][j1]val[k]+sum[k]2 ⇒ s u m [ i ] ⋅ s u m [ k ] + d p [ i ] [ j ] − v a l [ i ] = d p [ k ] [ j − 1 ] − v a l [ k ] + s u m [ k ] 2

x=sum[k] x = s u m [ k ] y=dp[k][j1]val[k]+sum[k]2 y = d p [ k ] [ j − 1 ] − v a l [ k ] + s u m [ k ] 2 ,斜率 sum[i] s u m [ i ] 单调递增,求截距 dp[i][j]val[i] d p [ i ] [ j ] − v a l [ i ] 最小值

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

C  hdu 4528

D        poj 1260

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

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

dp方程:

dp[i]=min(dp[j]+(sum[i]sum[j]+10)p[i])(j<i) d p [ i ] = m i n ( d p [ j ] + ( s u m [ i ] − s u m [ j ] + 10 ) ⋅ p [ i ] ) ( j < i )

p[i]sum[j]+dp[i](sum[i]+10)p[i]=dp[j] ⇒ p [ i ] ⋅ s u m [ j ] + d p [ i ] − ( s u m [ i ] + 10 ) ⋅ p [ i ] = d p [ j ]

x=sum[j] x = s u m [ j ] y=dp[j] y = d p [ j ] ,斜率 p[i] p [ i ] 单调递增,求截距 dp[i](sum[i]+10)p[i] d p [ i ] − ( s u m [ i ] + 10 ) ⋅ p [ i ] 最小值

E        hdu 2993

F        hdu 3669

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

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

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

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

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

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

设最后一个洞为 w[i]h[i] w [ i ] ⋅ h [ i ]

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

则加高到 h[k] h [ k ] 时必有费用 w[i](h[k]h[i])<w[j](h[k]h[j]) w [ i ] ⋅ ( h [ k ] − h [ i ] ) < w [ j ] ⋅ ( h [ k ] − h [ j ] ) ,即 i i 更优

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

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

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

dp[i][j]=min(dp[k][j1]+w[k+1]h[i])(k<i) d p [ i ] [ j ] = m i n ( d p [ k ] [ j − 1 ] + w [ k + 1 ] ⋅ h [ i ] ) ( k < i )

h[i]w[k+1]dp[i][j]=dp[k][j1] ⇒ h [ i ] ⋅ w [ k + 1 ] − d p [ i ] [ j ] = d p [ k ] [ j − 1 ]

斜率优化即可

G        hdu 3045

先从小到大排序

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

于是得到dp方程:

dp[i]=min(dp[j1]+(sum[i]sum[j1])a[j](ij+1))(Tin,jiT) d p [ i ] = m i n ( d p [ j − 1 ] + ( s u m [ i ] − s u m [ j − 1 ] ) − a [ j ] ⋅ ( i − j + 1 ) ) ( T ≤ i ≤ n , j ≤ i − T )

斜率优化即可

H        hdu 3516

I        poj 1160

dis[i][j] d i s [ i ] [ j ] [Vi,Vj] [ V i , V j ] 上建一个邮局的最小距离和

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

易知 dis[i][i]=0 d i s [ i ] [ i ] = 0

dis[i][j1] d i s [ i ] [ j − 1 ] dis[i][j] d i s [ i ] [ j ] 时,可视为将原邮局移动到新的位置,并加上 Vj V j 到新邮局的距离

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

dis[i][j]=dis[i][j1]+x[j]x[(i+j)/2] d i s [ i ] [ j ] = d i s [ i ] [ j − 1 ] + x [ j ] − x [ ( i + j ) / 2 ]

可以 O(n2) O ( n 2 ) 预处理出 dis d i s

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

dp[i][j]=min(dp[k][j1]+dis[k+1][i])(k<i) d p [ i ] [ j ] = m i n ( d p [ k ] [ j − 1 ] + d i s [ k + 1 ] [ i ] ) ( k < i )

边界条件 dp[i][1]=dis[1][i] d p [ i ] [ 1 ] = d i s [ 1 ] [ i ]

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

J        poj 1180

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

dp[i][j]=min(dp[k][j1]+(t+sumT[i]sumT[k])(sumF[i]sumF[k]))(k<i) d p [ i ] [ j ] = m i n ( d p [ k ] [ j − 1 ] + ( t + s u m T [ i ] − s u m T [ k ] ) ⋅ ( s u m F [ i ] − s u m F [ k ] ) ) ( k < i )

其中 t=s(j1)+sumT[k] t = s ⋅ ( j − 1 ) + s u m T [ k ]

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

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

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

dp[i]=min(dp[j]+(s+sumT[j1]sumT[i1])(sumF[n]sumF[i1]))(i<j) d p [ i ] = m i n ( d p [ j ] + ( s + s u m T [ j − 1 ] − s u m T [ i − 1 ] ) ⋅ ( s u m F [ n ] − s u m F [ i − 1 ] ) ) ( i < j )

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

K        poj 2841

L

重复题目

J        uva 12594

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值