• #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)了

  • 相关阅读:
    Windows8.1 + Nvidia cuda8.0 + Vs2015
    读《鲜花帝国》有感
    oracle-sql书写
    oracle--聚合函数和case when结合使用
    oracle正则表达式
    oracle中case when使用
    oracle分区表之列表分区
    linux下oracl字符集修改(WE8ISO8859P1 --> ZHS16GBK)
    linux 下安装oracle数据库
    oracle学习笔记
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8891584.html
Copyright © 2020-2023  润新知