题意:
就是有一个用来堆放货物的板,承重力为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)了