一直都想学的引荐东西了。
瞎给个 link。
不会证明,所以直接贴个结论。

再贴个例子:

主要可以用来解决操作种类很多,但是约束比较少的线性规划题,这样可以把约束和变量数交换,简化问题。
Bob 喜欢序列。
有一个长度为 n 的非负整数序列 a1,a2,…,an。每一步你可以从以下三种操作中选择一种执行:
-
选择一个区间 [l,r],将下标在这个区间里的所有数都减 1。
-
选择一个区间 [l,r],将下标在这个区间里且下标为奇数的所有数都减 1。
-
选择一个区间 [l,r],将下标在这个区间里且下标为偶数的所有数都减 1。
求最少需要多少步才能将序列中的所有数都变成 0。
n≤105
经典题了,虽然贪心做法一车,但作为线性规划入门还是不错的。
直接假设三种区间操作个数为 xl,r,yl,r,zl,r。
写出标准形式:
min1≤l≤r≤n∑xl,r+yl,r+zl,r{∑i∈[l,r]xl,r+yl,r=ai∑i∈[l,r]xl,r+zl,r=ainmod2=1nmod2=0∀xl,r,yl,r,zl,r≥0
直接对偶:
max∑aiki∀l,ri=l∑rki≤1i=l∑r[imod2=1]ki≤1i=l∑r[imod2=0]ki≤1ki∈R
容易发现 ki∈[−1,1]。
证明 ki 是整数其实是困难的,但一般做题时是大胆猜测。
于是一个简单 dp 即可,记录一下前面的最大值。