https://www.luogu.org/problemnew/show/CF802C
你有一个容量为k的空书架,现在共有n个请求,每个请求给定一本书ai,如果你的书架里没有这本书,你就必须以ci的价格购买这本书放入书架。当然,你可以在任何时候丢掉书架里的某本书。请求出完成这n个请求所需要的最少价钱。(1<=n,k<=80)
我们用费用流,很难一天一天考虑买还是不买,只能全都先买进来。考虑一种操作,能把多余的购入花费抵消掉。
考虑第i天购入的一本书,如果留到了第j天,我们可以在第j-1天“卖”掉这本书,获得相应的收入。这样就相当于第j天没有买这本书。
建图方法如下:
对每天都有两个节点vi,vi'表示入点和出点。
从源点向每个vi连容量为1,费用为当天这种书的价格c[ai]的边,表示每本书。
从每个vi向vi+1连容量为k-1,费用为0的边,表示第i天书架最多留k-1本书,剩下1个位置给第i+1天的书。
从每个vi向vi′连容量为1,费用为0的边,表示当天买来就扔掉了这本书。
从vi−1向ai上一次的出现位置j对应的vj′连容量为1,费用为−c[ai]的边,表示卖掉这本书。
从每个vi′向汇点连容量为1,费用为0的边,表示要么扔,要么卖,最多选择一种。
如果当天没有扔,则当天的流一定会顺着书架往下流,直到卖掉。