泛化背包问题

来源:互联网 发布:左右删失数据 编辑:程序博客网 时间:2024/05/20 09:10

简写,笔录,不写太多。

  

概要:

        给出若干物品,对于每个物品的投入x,会得到一个特定回报f(x)

        已知总投入为M元,求能得到的最大回报N元。


方程即为:dp(x) = max{ dp(x),dp(a) + l(x-a)}  (A式) .这是对于线性数据而言的,没有依赖关系。


在树上学习到了一个很厉害的写法:

        一般来说,如果是要把 A式 用在树规上, 时间大概在 O(N^3)

        转换一个巧妙地表达方法即可压缩到   O(N^2)


描述:

    dfs(int root , int m)  //m表示总投入

     对于每一个子节点:

    f[subtree][i] <- f[root][i]     i=0,1,2....m-1

    dfs(subtree,i);

    f[root][i] = f[subtree][i-1] + value[i];  i = 0,1,2.....m


讲白,就是每次处理子节点,先把root的值赋进去,然后在进行递归搜索,为什么这样是有用的?


我们知道,如果反复使用A式求解的话 , 事实上每次动规都没有和父节点联系起来,而是在所有数据处理完了以后,再进行计算。


这就浪费了大量的时间。


把父节点的值回代,使得父节点成为整个动态规划的一部分。因为父节点的值对于子树的计算过程没有丝毫影响,计算完毕后,直接更新父节点的值。有点类似于线段树的“有了标记要值还有什么用”(哈哈哈哈)


//注

第一个循环到m-1 ,因为如果你要考虑使用这个节点,本身也需要使用,那么能够分配给这个节点的子树的投入只有m-1个了 


    

        

0 0
原创粉丝点击