CF704B

题面

\(n\) 个元素,第 \(i\) 个元素有五个参数 \(x_i, a_i, b_i, c_i, d_i\)。试求出一个\(1 \sim n\) 的排列 \(p\),满足 \(p_1 = s, p_n = e\),同时最小化这个排列的权值。

一个排列的权值为\(\sum_{i=1}^n f(p_i, p_{i+1})\),其中 \(f(i, j)\) 的值有两种情况:

  • \(i > j\),则 \(f(i, j) = x_i-x_j+c_i+b_j\)
  • \(i < j\),则 \(f(i, j) = x_j-x_i+d_i+a_j\)

数据范围: \(n\le 5\times 10^3\)

题解

dp 的一种模型,因为 \(i\) 产生的贡献和他两边的数的大小有关,所以我们按照 \(i\) 从小到大加入,维护连续段的数量。

这里连续段是指,我们已经加入了小于 \(i\) 的数,然后钦定每一个连续段中间不能再插入数,现在考虑加入的 \(i\) ,他左边/右边都可以接/不接一个已有的连续段。

为什么这样做,因为这样我们在加入 \(i\) 的时候是知道他两边的数比他大还是小,接连续段 \(\rightarrow\) 小,不接 \(\rightarrow\) 大。

所以这样就可以转移了。

还要注意一点,就是如果确定了起点/终点了之后(这里给定了、但也可以不给定,这时候就需要设 \([0/1][0/1]\) 表示确定起点、终点),就要避免一些不合法的状态。

具体来说,就是不能有当连续段只有 \(1\) 个的时候放一个数在起点左边/终点右边。

扩展

考虑还有什么情况下" \(i\) 产生的贡献和他两边的数的大小有关",绝对值!

如果贡献式子中带了 \(|x_i-x_j|\) 这种东西,那么就把 \(x_i\) 排序,然后按上面的办法设连续段。

启发

  • 一种新的dp模型。
posted @ 2022-03-25 14:34  qwq_123  阅读(31)  评论(0编辑  收藏  举报