ural1018. Binary Apple Tree

题目大意

有一棵n个节点的树,树上每个节点有一个值,选择m个节点使这些节点值的和最大
要求:如果选当前节点,则必须选它的父节点

解法:

我们设dp[i][j]为以i为根的树上留j个节点的最大值,转移方法如下

for(int j=min(q,size[x]);j>;j--){//size表示子树的大小
for(int k=min(j-,size[v]);k>;k--){//因为父节点要保留所以j-k要>=1
dp[x][j]=max(dp[x][j],dp[v][k]+dp[x][j-k]);//v为x的子节点
}
}

复杂度O(n*m^2)

“金明的预算方案”加强版

题目大意

有一棵n个节点的树,树上每个节点有一个代价和一个价值,选择若干个节点使这些节点的价值最大并且代价不超过m
要求:如果选当前节点,则必须选它的父节点$n\le 5000,m\le 10000$

题解:

如果还像上一题那样考虑的话,dp[i][j]为以i为根的子树代价为j的最大价值,
共有m*n个状态,每个状态O(m)转移,复杂度O(m*m*n),虽然达不到那么高,但也一定会超时

考虑优化

首先将所有节点后序遍历,p[i]保存dfs序为i的节点编号,
l[i]保存在i节点的子树之前遍历的最后一个dfs序,如下图

节点右侧的为节点的dfs序,左上角的为l的值:
如p[4]=7,l[7]=3代表7号节点dfs序为4,在7节点的子树之前遍历的最后一个dfs序为3

然后将dp[i][j]的意义改为前i个遍历的节点代价为j的最大值

dp[i][j]=max(dp[l[u]][j](当前节点不选,则子树都不能选),dp[i-1][j-v[u]]+w[u](选当前节点))   注:u=p[i];
于是状态转移变成O(1)了,时间复杂度O(n*m)

思考一下上一题是否也可以这样优化?

只需将dp[i][j]的意义改为前i个遍历的节点留j个的最大值即可,其他转移都一样

部分树形DP的优化的更多相关文章

  1. 树形dp空间优化(dfn)

    树形dp空间优化 介绍 有时题目会告诉我们n叉树的最大层数,或者给出一个完全n叉树树,直接做树形dp会爆空间时,就可以用这个优化方法. 多数树形dp都是先dfs到子树,再合并到根上,显然当合并到根上时 ...

  2. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

  3. Codeforces 1179D 树形DP 斜率优化

    题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...

  4. POJ 1155 (树形DP+背包+优化)

    题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...

  5. HDU - 5909 Tree Cutting (树形dp+FWT优化)

    题意:树上每个节点有权值,定义一棵树的权值为所有节点权值异或的值.求一棵树中,连通子树值为[0,m)的个数. 分析: 设\(dp[i][j]\)为根为i,值为j的子树的个数. 则\(dp[i][j\o ...

  6. Ural 1018 (树形DP+背包+优化)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...

  7. 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)

    有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...

  8. bzoj3672: [Noi2014]购票(树形DP+斜率优化+可持久化凸包)

    这题的加强版,多了一个$l_i$的限制,少了一个$p_i$的单调性,难了好多... 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ $\frac {f(j) ...

  9. P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分

    $ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...

随机推荐

  1. Java 10的10个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  2. Python3升级3.6强力Django+杀手级xadmin打造在线教育平台✍✍✍

    Python3升级3.6强力Django+杀手级xadmin打造在线教育平台 教程 Xadmin安装方法: settings.py 的配置: users App 下的 adminx.py 的配置:

  3. USACO training course Mother's Milk /// DFS(有点意思) oj10120

    题目大意: 输入 A B C 为三个容器的容量 一开始A B是空的 C是满的 每一次倾倒只能在 盛的容器满 或 倒的容器空 时才停止 输出当A容器空时 C容器内剩余量的所有可能值 Sample Inp ...

  4. 最难的工作 /// SPFA模板 oj1396

    题目大意: Input 第一行是一个整数T ( T ≤ 100 ),表示测试用例的个数. 每个测试用例的第一行是两个整数 n 和 m ( 1 ≤ n ≤ 200 , 0 ≤ m ≤ 10000 ),分 ...

  5. java_JDK8中新增的时间API

    java.time 包含值对象的基础包 java.time.chrono 提供对不同的日历系统的访问 java.time.format 格式化和解析时间的日期 java.time.temporal 包 ...

  6. JSONObjectSample

    package com.egeniuss.platform.basic; import java.util.ArrayList; import java.util.HashMap; import ja ...

  7. easyui combotree的使用示例

    一.View: 1.定义输入控件 <input id="ParentId" name="ParentId"> 2.绑定combotree $('#P ...

  8. JS规则 保持先后顺序(操作符优先级)操作符之间的优先级(高到低): 算术操作符 → 比较操作符 → 逻辑操作符 → "="赋值符号

    保持先后顺序(操作符优先级) 我们都知道,除法.乘法等操作符的优先级比加法和减法高,例如: var numa=3; var numb=6 jq= numa + 30 / 2 - numb * 3; / ...

  9. 开发函数计算的正确姿势 —— 使用 ROS 进行资源编排

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  10. echarts的使用——vue

    在vue的项目开发中,数据的可视化可以用echarts来实现,具体用法如下: (1)安装echarts,进入项目目录,执行如下命令,安装echarts: npm install echarts (2) ...