[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

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值