貌似挺容易的。
将输入数据离散化一遍,前缀和处理出点与点之间的距离,某一个区间每秒损失权值。
设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}}
]
知识点:
- 当区间满足 (i,k)+(k+1,j)=(i,j-1)+(j,j)时,我们往往可以将(n^3)的方程变成(n^2)
- 当我们没办法表示一个区间内的局部最优解时,我们不妨直接在总答案里加上贡献。 如 树上染色