Sue的小球

貌似挺容易的。

将输入数据离散化一遍,前缀和处理出点与点之间的距离,某一个区间每秒损失权值。

F[i][j][0/1]为区间i,j关完在 左边/右边 的最小失去权值。

这样我们的状态转移方程就是

F[i][j][1]=max(F[i][j-1][0]-Time(i,j)*Except(i,j-1)) 
// 拿到i->j-1 后在这段区间的左边,往右走到 j 的过程中 我们花去了Time的时间,在这段时

// 间里,其他物品往下掉了(我们损失总价值是)Except*Time

F[i][j][1]=max(F[i][j-1][1]+Time(j-1,j)*Except(i,j-1)) // 从最右端走一个单位

同理:

F[i][j][0]=max(F[i+1][j][1]-Time(i,j)*Except(i+1,j))

F[i][j][0]=max(F[i+1][j][0]-Time(i,i+1)*Except(i+1,j))

最终的答案便是:

[ sum_{i=1}^{i<=n} Y[i]-min{f_{1,n,0},f_{1,n_1}} ]

知识点:

  1. 当区间满足 (i,k)+(k+1,j)=(i,j-1)+(j,j)时,我们往往可以将(n^3)的方程变成(n^2)
  2. 当我们没办法表示一个区间内的局部最优解时,我们不妨直接在总答案里加上贡献。 如 树上染色
原文地址:https://www.cnblogs.com/guodongLovesOi/p/11651060.html