sb的斜率优化笔记

参考资料


[HNOI2008]玩具装箱

设 S[i] = Σ1≤i≤n (C[i] + 1), 设状态 dp[i] 表示装好前 i 个, 值为最小花费, 则转移为:
dp[i] = min0≤j<i {dp[j] + (S[i]-S[j]-1-L)2} 。

化简 (S[i]-S[j]-1-L)2 :将常量 L 加一, 变成 (S[i]-S[j]-L)2, 而后变成 S[i]2 + (S[j] + L)2 - 2S[i]S[j] - 2S[i]L。

最后方程化简为 :dp[i] = min0≤j<i {dp[j] + S[i]2 + (S[j] + L)2 - 2S[i]S[j] - 2S[i]L} , 是 dp[i] = min/max {a(i) + b(j) + c(i) × d(j)} 的形式。

看上去很 NB 的代数法

考虑 dp[i] 的两个决策点 j1 < j2, 假设 j2 优于 j1, 可得:

(-2S[i]S[j2]) + (dp[j2] + (S[j2] + L)2) ≤ (-2S[i]S[j1]) + (dp[j1] + (S[j1] + L)2)

继续化简:

-2S[i] (S[j2] - S[j1]) ≤ (dp[j1] + (S[j1] + L)2) - (dp[j2] + (S[j2] + L)2)

由于 S[j2] > S[j1], 故可除:

2S[i] ≥ \(\dfrac{(dp[j_2]+(S[j_2]+L)^2) - (dp[j_1]+(S[j_1]+L)^2)}{S[j_2]-S[j_1]}\)

若有 j2 > j1, 就可以通过判断这个东西是否成立来判断 j2 这个决策点是不是优于 j1 这个决策点。

然后设 X(i) = S[i], Y(i) = dp[i] + (S[i] + L)2, 再设 P(i) = (X(i), Y(i)) (平面直角坐标系上的一个点), 问题就是在平面直角坐标系上的一个斜率判定问题。

考虑一个只有三个点的上凸包, 可知不论怎样,用上面那个结论可观测到的有效决策集合是原决策集合的下凸包。具体推理见参考资料

线性规划法

复习下形式:dp[i] = min/max {a(i) + b(j) + c(i) × d(j)}

这种线性规划法就是把某个决策点 j 的转移,即 dp[i] = a(i) + b(j) + c(i) × d(j), 在某个来自西方的神秘二维结构(即平面直角坐标系)上以某种方式展开, 然后转化为在这个二维结构上的最优化问题。

具体地, 先将除了 dp[i] 的东西以 ' 标示之, 记为常量:

dp[i] = a(i)' + b(j) + c(i)' × d(j)

然后将式子化成:

b(j) = -c(i)' × d(j) - a(i)' + dp[i]

然后现在的问题就是将所有决策点看成 (d(j),b(j)), 然后把一个斜率为 -c(i)' 的直线对齐每个点, 找出最小的截距。

发现上凸包是不存在的, 维护决策点的下凸包即可。

两种方法的评价

线性规划 >>> 代数法,降维打击!

posted @ 2021-01-17 16:34  xwmwr  阅读(86)  评论(0编辑  收藏  举报