[POJ1155]TELE(树形背包dp)
看到这道题的第一眼我把题目看成了TLE
哦那不是重点
这道题是树形背包dp的经典例题
题目描述(大概的):
给你一棵树,每条边有一个cost,每个叶节点有一个earn
要求在earn的和大于等于cost的和的前提下问最多能连接到多少个叶节点
思路:
这道题卡了我0.5month
(因为我太懒了)
核心思路
用dp[x][k]表示x为根的子树里连接到k个叶节点时最大的利润(earn和-cost和)
那么for嵌套顺序应当是
for(int s=cd[x];s;s--/*int d=cd[t];d;d-- <-- It is wrong*/) { for(int d=min(cd[t],s);d;d--/*int s=cd[x];s>=d;s-- <-- It is wrong*/) { ){dp[x][s]=max(dp[x][s],dp[x][s-d]+dp[t][d]-e[i].v);} } }
没错,也就是外层枚举x的体积,内层枚举t的体积,都是从大到小
至于为什么?
因为t的所有可能体积的dp你只能将其中一个装进x的dp里
听说这叫分组背包?反正我看着也差不多
此后就可以开始快乐地dfs了
(为什么看不少人都用滚动数组呢...dp[3001][3001]也不大啊)
剩下还可以加一些小小的优化
看代码吧
#include<cstdio> int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} struct sumireko { int to,ne,v; }e[]; ],cnt; void addline(int f,int t,int vin) { e[++cnt].to=t; e[cnt].ne=he[f]; e[cnt].v=vin; he[f]=cnt; return; } //bool v[3001]; //写完才注意到是有向边,所以v意义不大,完全可以全部抛弃 //但删完之后反而变慢了 //越简化越慢也是有毒 ];//其中cd数组与下面的findd()一起使用,用于找出每个节点的子树有几个叶节点,从而省点时间(大概) int findd(int x) { ; for(int i=he[x];i;i=e[i].ne) { int t=e[i].to; cd[x]+=findd(t); } return cd[x]; } ][]; void dfs(int x) { for(int i=he[x];i;i=e[i].ne) { int t=e[i].to; dfs(t); for(int s=cd[x];s;s--/*int d=cd[t];d;d-- <-- It is wrong*/) { for(int d=min(cd[t],s);d;d--/*int s=cd[x];s>=d;s-- <-- It is wrong*/) { )dp[x][s]=max(dp[x][s],dp[x][s-d]+dp[t][d]-e[i].v); } } } return; } int main() { scanf("%d%d",&n,&m); ;i<=n-m;i++) { int k,tin,vin; scanf("%d",&k); ;j<=k;j++) { scanf("%d%d",&tin,&vin); addline(i,tin,vin); } } findd(); ;i<=n;i++) { ;j<=cd[i];j++) { dp[i][j]=-;//初始化 } } ;i<=n;i++) { scanf(]); } dfs(); ];i>=;i--) { ][i]>=) { printf("%d",i); ; } } ; }
[POJ1155]TELE(树形背包dp)的更多相关文章
- POJ-1155 TELE 树形背包dp
dp[u][i]代表以u为根的子树选i个叶子的最大收益 那么dp[u][i]=max(dp[u][i],dp[v][k]+dp[u][i-k]-len) (1=<k<=i) 细节看代码: ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...
- 【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp
题目描述 给出一个有 $2^n$ 个叶子节点的完全二叉树.每个叶子节点可以选择黑白两种颜色. 对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :如果 $i$ 和 $j$ 的 ...
- 【bzoj4987】Tree 树形背包dp
题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...
- 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
- HDU1561 The more ,The better (树形背包Dp)
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...
- HDU-4044 树形背包dp好题
不会做,题解是参考网上的.感觉这道题是到好题,使得我对树形背包dp更了解了. 有几个注意的点,直接给出代码,题解以及注意点都在注释里了. #include<bits/stdc++.h> u ...
随机推荐
- 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值
关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...
- POJ1664 计数 DP
题目传送门 http://poj.org/problem?id=1664 设$dp[i][j]$表示$i$个苹果放在$j$个盘子里的总数 $1.$ 当 苹果数 小于 盘子数 $(M < N) ...
- USACO Section 1.1PROB Your Ride Is Here
题目传送门 不能提交哦 http://www.nocow.cn/index.php/Translate:USACO/ride /* ID: jusonal1 PROG: ride LANG: C+ ...
- 【POI】T1 特工 szp
T1 特工szp [问题描述] Byteotian 中央情报局 (BIA) 雇佣了许多特工. 他们每个人的工作就是监视另一名特工.Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过 ...
- WPF获取原始控件样式
要获取WPF控件的原始样式,需要我们安装Blend for Visual Studio. 然后,我们打开Blend for Visual Studio,创建一个WPF项目. 然后,我们向页面拖动一个B ...
- POJ2069 最小球覆盖 几何法和退火法
对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450 现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径. 先给出以下几个事实: 1.对于一 ...
- SPOJ BEADS 最小字符串表示
SPOJ BEADS 给一个字符串(环) 问从哪个字符开始,字典序最小. 可以脑补到很多线性的解法,不过以下这个是最简单的,代码非常简单,就不解释了. #include<iostream> ...
- 【转载】7条便利的ViewState技巧
32.Seven handy ViewState tips 32.7条便利的ViewState技巧 Every time I have to deal with a classic ASP.NET W ...
- AutoCAD2013 以上利用AccoreConsole+ c# NetApi 批量处理图纸
AccoreConsole听起来有点拗口,其中文名可以叫做AutoCAD控制台或者无头AutoCAD.一句话概括,它是快速启动AutoCAD运行微环境,高效的处理图纸.你可以如同DOS命令行一样操作命 ...
- JAVA POI的使用
最近开发遇到了要通过Java处理Excel文件的场景,于是乎在网上了解了一番,最后自己做了个demo,已上传gitee:https://gitee.com/github-26930945/JavaCo ...