题目:P1987 摇钱树
\(\text{蒟蒻在DP之路上求索着}\)
这道题我一开始竟然觉得是区间DP
思路
看起来这道题我们可以以任何顺序来砍树,这就牵扯到先后砍树哪一种更优.如果我们要暴力的话,那就是枚举树的全排列,然后寻找最优解.可是如果我们不枚举,有没有办法通过一些方法判断出哪一棵树先砍呢?
还记得国王游戏吗,在那一题中我们讨论了邻项交换法来寻找贪心策略.我们不妨来尝试一下.
假设一棵树上的总钱数是\(A\),每天掉落\(a\)个,另一棵树是\(B\)和\(b\).我们先按照\(A,B\)的顺序在时间\(x\)和\(x+1\)砍掉.这时我们将会得到的收益为\(A-ax+B-b(x+1)[1]\).而我们交换\(AB\),得到的收益是\(A-a(x+1)+B-bx[2]\),如果先砍\(A\)更优,那么我们要求\([1]\)式-\([2]\)式要大于0.经过整理,我们发现此时\(a-b>0\),也就是\(a>b\).现在我们可以得出结论了:先砍倒掉钱速度快的树更划算.因此我们要按照掉落速度从大到小排序.
但是我们只能砍掉K棵树,也就是说我们上文提到的\(B\)不一定能砍掉,然而我们的交换是在两棵树都能砍掉的前提下进行的,因此要有所取舍.这就是一个容量是K的01背包问题.设\(f[j]\)表示砍掉\(i\)棵树的最大值,那么我们不难得出:
\[
f[j]=max(f[j],f[j-1]+max(0,A[i]-a[i]\times (j-1)))(1\le i\le n,1\le j\le max(i,K))
\]
这样问题就解决了.因此贪心和DP有时也能有很好的结合.
当然了:
\(\textit{多测不清空,爆零两行泪}\)