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模型。