#2 codeforces 480 Parcels

题意:

就是有一个用来堆放货物的板,承重力为S。现在有N件货物,每件货物有到达的时间,运走的时间,以及重量,承重,存放盈利。如果这件货物能再运达时间存放,并在指定时间取走的话,就能获得相应的盈利值。货物都是逐个往上叠的,每个箱子上面的总重量不能大于箱子的承重。总的质量不能大于板的承重,货物上面还有货物的话是不能被取走的。现在求最大的盈利值。

代码:

第一感觉就是区间dp

网上还有一种粗看没看懂就不想看了。。

首先观察出来的性质就是区间只有包含与不相交两种情况

比较简单粗暴的是f[i][j][k]表示i-j的区间,重量分立的最大值<=k

f[i][j][k]可以由f[i][j'][k]+f[j'+1][j-1][k]转移

如果i-j上有区间再与它合并一下

这样是n^3s的

会发现这么做很浪费啊

有一种很常见的方法是把问题图形化

这题里显然区间呈包含关系那么一定是一张DAG

那么可以考虑在DAG上dp

f[i][k]表示第i个点,重量分立的最大值<=k

那么转移是怎么样的呢?

会发现是在它的儿子中选择不相交的且max(k1,k2,k3)<=它的载重

那可以把儿子提取出来排个序 nlogn

这个可以枚举k然后O(n)做覆盖问题

这样就是O(n^2*S)了

posted @ 2018-04-20 16:27  尹吴潇  阅读(91)  评论(0编辑  收藏  举报