首页 > 其他分享 >P2014 选课 ( 树上背包 )

P2014 选课 ( 树上背包 )

时间:2023-01-31 00:22:05浏览次数:41  
标签:背包 选课 P2014 siz 复杂度 节点 我们 dp

先看树上背包的板子:

假设我们的树长这样:

那么其实我们就有个比较朴素的想法:

对一个结点 对它的儿子们进行背包dp

比如对于1号点 我们就可以对2号 3号进行背包dp

问题是4号咋整?

我们不难发现 对于4号点 我们有4 45 46 456四种不同的选择 每一种对应的体积与价值各不相同

那我们就把数组扩展到二维:


用f[i][j]表示以i为根的子树中 总体积为j的时候能带来的最大价值


那么状态转移方程怎么想(以下为个人理解)

可以发现 我们对一个根节点的所有儿子进行背包dp的时候 同一个儿子只能选一个状态(即f[i][j]中对于同一个i只能选一个j)

所以我们可以把它看成分组背包:

对于一个根节点 它的每一个儿子都为一组 每组只能选一个

然后如果你还记得分组背包的代码:


(从oi wiki上扒的)

那么其实可以类比一下 树上背包的代码就出来了:

这里特别注意一下 由于我们的父亲是由儿子转移过来的 所以先dfs儿子再进行下一步


现在状态设计好了 状态转移方程有了 别忘了写边界条件:

(一定要记得w[x]后面的都要填上)

完整代码就不贴了(其实是我懒得写了)

时间复杂度为O(n\(m^2\)) (单次转移O(\(m^2\)) dfs有n次)


现在在看这题 好像就是一个w[i]全为1的树上背包

一算复杂度 \(300^3\) 还真能过

以下为本题代码:



当然了 这题这题还有个 n , m <= 1,000 的版本 那这个显然就过不去了

为此我们可以对这种w[i]全为1的情况做一个优化:

我们再回头看原来那个状态转移方程:

我们思考这样两个问题:k是什么 j又是什么

答:k是给这个子树分配的最大节点个数 j是当前这个根节点容纳的节点个数

那么我们不难发现 其实k是不会超过这个子树大小 同理j也不会超过已经合并过的子树的大小

所以我们可以动态维护一个数组siz[i]表示以i为根节点的树的大小

然后每一次dp的时候siz[i] += siz[i的儿子](噢对了别忘了初始化 所有的节点最开始的siz都为1 )

这样我们就可以减少k和j的枚举次数了

具体代码如下:

此方法复杂度为O(mn)


关于复杂度证明:

首先感觉这就是个挺玄乎的玩意 你只要知道它复杂度是这个就行((

这里提供一个本人想到的不是很严谨也可能不是很正确的证法:

这里简化下题意:单纯将根的所有儿子合并 所用的时间复杂度 设树的大小为n 则复杂度应为O(\(n^2\))

标签:背包,选课,P2014,siz,复杂度,节点,我们,dp
From: https://www.cnblogs.com/Steven24/p/17077614.html

相关文章

  • 前缀后缀01背包(牛客2023多校D清楚姐姐学01背包)
    0x1f题目:https://ac.nowcoder.com/acm/contest/46812/D0x2f题意:定义初始背包的最优解\(V_{max}\)定义n个物品去掉任意一个后,最优解为\(V_{max}'\)每一个物品\(w......
  • 背包问题
    简化的01背包分析:原问题:i件物品选若干件组成的小于V的最大体积是多少?用可行性描述就可bool数组\(f[i][j]\)表示前i个物品能否放满体积为j的背包枚举最后一次决策—......
  • 什么是背包问题?
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师JdreamZhang假设我们一共有n种物品,每种物品i的价值为vi,重量为wi,我们有一个背......
  • (AtCoder Beginner Contest 287)(D 字符串前后缀合并匹配)(E Trie求最长公共前缀(LCP)
    D-MatchorNot(字符串前后缀合并匹配)题目大意:给定两个字符串S和T,对于每个x=0,1,2...|T|求S的子串(前x个字符和后|T|-x个字符在不改变顺序的情况下组成)是否与T相......
  • 背包DP
    背包dp前言:由于普通的背包板子太板了,所以不多赘述,直接讲有价值的1.多重背包的二进制优化把一个物品的数量二进制拆分,例如有10个价值a的物品,我们把它拆成1+2+4+3个,这样......
  • AcWing 01背包问题
    有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总......
  • 动态规划 背包问题算法模板
    一篇文章吃透背包问题!(细致引入+解题模板+例题分析+代码呈现)  https://leetcode.cn/problems/partition-equal-subset-sum/solution/yi-pian-wen-zhang-chi-tou-bei-b......
  • 【多重背包】Atcoder Beginner Contest 286----D
    题目:D-MoneyinHand(atcoder.jp)分析:经典的多重背包。用dp[i]表示i能否正好凑出。先复习一下多重背包。多重背包就是有N组物品,每组最多有k个,每组可以选多个。分组背......
  • hdu:Big Event in HDU(母函数,背包)
    ProblemDescriptionNowadays,weallknowthatComputerCollegeisthebiggestdepartmentinHDU.But,maybeyoudon’tknowthatComputerCollegehadeverbe......
  • 背包问题
    背包问题1.0-1背包问题0-1背包问题为:有N件物品和一个容量为V的背包,第i件物品的体积和价值分别为volume[i]和value[i],求解将哪些物品装入背包可以获得最大价值针对0-1......