题目大意:
有 n n n个菜在烤炉里,第 i i i个菜将在第 t i t_i ti时刻做好。现在每个时刻只能拿出一个菜。一个菜的不开心程度为 ∣ T − t i ∣ |T-t_i| ∣T−ti∣. T T T是这个菜拿出来的时间.现在让你最小化这 n n n个菜的不开心程度。 ( n ≤ 200 , 1 ≤ t i ≤ n n \leq 200,1 \leq t_i \leq n n≤200,1≤ti≤n)
题目思路:
我的思路,,被这个 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(i−1,L−1)+val.
时间复杂度: O ( n 3 ) O(n^3) O(n3)
代码就不放了,繁杂,写了快一个小时
正解思路:
本质上是一个子序列模型.考虑每一个菜在每个时刻有一个代价 ∣ T − t i ∣ |T-t_i| ∣T−ti∣.现在问你放置这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(i−1,j),dp(i−1,j−1)+∣ti−j∣}
完了,水…