可以系统地解决一系列贪心问题的思想。
操作步骤
-
首先对于一个问题建立费用流模型,注意这时候可以得到问题的凸性(convexity),可以用一些其它方法对问题进行简化(如wqs二分),然后观察费用流模型的特殊性,考虑快速算费用流。
-
一般而言,可以考虑图的增量对答案的贡献,或者按照EK算法以某种顺序求增广路,注意反向边的贡献(比如负环)。一般用堆来维护,也有时候可以直接维护出一些东西然后做。
-
将费用流模型和原问题结合起来考虑,往往会比较容易得到一些性质。
例题
CF865D Buy Low Sell High(老鼠进洞·壹)
题意:已知接下来nn天的股票价格,每天你可以买进一股股票,卖出一股股票,或者什么也不做。假设你拥有无限本金,求nn天之后能得到的最大利润。
容易得到费用流模型:相邻点双向(+∞,0)(+∞,0),源点向每个点(1,ci)(1,ci),每个点向终点(1,−ci)(1,−ci)求最小费用可行流。
考虑增量贡献,第一种情况是选择某天买进今天卖出,第二种情况是选择之前卖出的某天换到今天卖出,对应到费用流上就是一条普通的增广路和负环,那么维护一个堆就做完