zoukankan      html  css  js  c++  java
  • #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)了

  • 相关阅读:
    字符串-06. IP地址转换
    字符串-05. 字符串循环左移
    字符串-04. 字符串逆序
    BZOJ 3110
    UOJ 34 fft板子
    BZOJ 2716
    BZOJ 2243
    BZOJ 3697
    BZOJ 1176
    BZOJ 2599
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8891584.html
Copyright © 2011-2022 走看看