Educational Round 97-C:dp

题目大意:

n n n个菜在烤炉里,第 i i i个菜将在第 t i t_i ti时刻做好。现在每个时刻只能拿出一个菜。一个菜的不开心程度为 ∣ T − t i ∣ |T-t_i| Tti. T T T是这个菜拿出来的时间.现在让你最小化这 n n n个菜的不开心程度。 ( n ≤ 200 , 1 ≤ t i ≤ n n \leq 200,1 \leq t_i \leq n n200,1tin)

题目思路:

我的思路,,被这个 n = 200 n=200 n=200 迷惑了。 O ( n 3 ) O(n^3) O(n3).在比赛的时候想的太复杂了。但是也A了。

先将 t i t_i ti归桶。考虑每次处理一个时刻的所有菜。不难看(猜)出一个时刻的所有菜的放置一定是连续的一段(不连续,可以通过交换,最终答案不变。)

所以令 d p ( i , j ) dp(i,j) dp(i,j)代表前 i i i个时刻以内的所有菜,使用前 j j j个时刻的最小代价.

对于新增的一个时刻,给他分配一个区间 [ L , R ] [L,R] [L,R].然后check这个区间,计算贡献。转移就是 d p ( i , R ) = d p ( i − 1 , L − 1 ) + v a l dp(i,R) =dp(i - 1,L - 1) + val dp(i,R)=dp(i1,L1)+val.

时间复杂度: O ( n 3 ) O(n^3) O(n3)

代码就不放了,繁杂,写了快一个小时

正解思路:

本质上是一个子序列模型.考虑每一个菜在每个时刻有一个代价 ∣ T − t i ∣ |T-t_i| Tti.现在问你放置这n个菜使得总代价最小.

所以对菜的时间排序.然后令 d p ( i , j ) dp(i,j) dp(i,j)代表前i个菜,在时刻j以内做完的最小代价.考虑第 i i i个菜在是否在第 j j j个时刻做了.有两种转移:

d p ( i , j ) = m i n { d p ( i − 1 , j ) , d p ( i − 1 , j − 1 ) + ∣ t i − j ∣ } dp(i,j) = min\{dp(i - 1,j),dp(i - 1,j -1)+|t_i-j|\} dp(i,j)=min{dp(i1,j),dp(i1,j1)+tij}

完了,水…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值