POJ 1155 TELE 背包型树形DP 经典题
由电视台,中转站,和用户的电视组成的体系刚好是一棵树
n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root
现在节点1准备转播一场比赛,已知从一个节点传送数据到达另一个节点,电视台需要一定的费用
若可以传送数据到达用户的节点n-m+1~n,这些用户各自愿意支付一定的费用给电视台
现在电视台希望在不亏本的情况下为尽量多的用户转播比赛
输出最多可以为多少用户转播比赛
背包类型的树形DP第一题
dp[i][j]表示以节点i为根的子树有j个用户获得转播,电视台的最大收益
由于收益有正有负
初始化:
dp[i][0]=0
dp[i][j]=-inf(j>0)
目标:dp[1][j]>=0的条件下最大的j
(dp[1][j]>=0表示电视台不亏本)
dfs的过程递推dp
有个主意的地方写在了注释
#include<cstdio>
#include<cstring> using namespace std; inline int max(int a,int b)
{
return a>b?a:b;
} const int maxn=;
const int inf=0x3f3f3f3f; int dp[maxn][maxn];
int cost[maxn][maxn];
int siz[maxn];
struct Edge
{
int to,next;
};
Edge edge[maxn];
int head[maxn];
int tot;
int n,m; void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
} void init()
{
memset(head,-,sizeof head);
tot=;
for(int i=;i<=n;i++)
{
dp[i][]=;
for(int j=;j<=m;j++)
dp[i][j]=-inf;
}
} void solve();
void dfs(int u); int main()
{
while(~scanf("%d",&n))
{
scanf("%d",&m);
init();
for(int i=;i<=n-m;i++)
{
int num;
scanf("%d",&num);
while(num--)
{
int u;
scanf("%d",&u);
scanf("%d",&cost[i][u]);
addedge(i,u);
}
}
for(int i=n-m+;i<=n;i++)
{
scanf("%d",&cost[i][maxn-]);
}
solve();
}
return ;
} void solve()
{
dfs();
for(int j=siz[];j>=;j--)
{
if(dp[][j]>=)
{
printf("%d\n",j);
return ;
}
}
/*
for(int i=0;i<=siz[1];i++)
printf("%d\n",dp[1][i]);
*/
} void dfs(int u)
{
siz[u]=;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(n-m<v)
{
dp[v][]=;
dp[v][]=cost[v][maxn-];
siz[v]=;
}
else
{
dfs(v);
}
siz[u]+=siz[v]; //由于更新dp[u][j]的时候
//dp[u][j-k]需要表示以u为根的子树,有j-k个是从前面的儿子节点取的
//所以这个时候dp[u][j-k]不可以被儿子节点v更新过(保证j-k个都是从前面取的)
//所以递推时j要逆推
//当然,k和j循环的顺序也就不可以交换了
for(int j=siz[u];j>;j--)
{
for(int k=;k<=siz[v];k++)
if(j>=k)
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-cost[u][v]);
}
}
}
POJ 1155 TELE 背包型树形DP 经典题的更多相关文章
- hdu 1561 The more, The Better 背包型树形DP 简单题
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 51nod 1353 树 | 树形DP经典题!
51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- POJ 1155 - TELE 树型DP(泛化背包转移)..
dp[x][y]代表以x为根的子树..连接了y个终端用户(叶子)..所能获得的最大收益... dp[x][ ]可以看成当根为x时..有个背包空间为0~m...每个空间上记录了到到达这个空间的最大收益. ...
- POJ 2486 Apple Tree (树形dp 经典题)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- P2016 战略游戏——树形DP大水题
P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...
- (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520
题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...
随机推荐
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- poj3687 拓扑序
题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...
- hdu1078 记忆化搜索(DP+DFS)
题意:一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子上的数必须比上一个走的格子的数大,问最大的路径和. 我一开始的思路是,或许是普通的最大路径和,只 ...
- Codeforces Round #339 Div.2 A - Link/Cut Tree
第一次正式参加常规赛想想有些小激动的呢 然后第一题就被hack了 心痛 _(:зゝ∠)_ tle点在于越界 因此结束循环条件从乘变为除 done //等等 这题没过总评 让我静静........ // ...
- Java——jdk1.5新特性
/* * 可变参数:--一个方法的参数个数不固定. * 特点: * 只能出现在参数列表的最后. * 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参 ...
- FreeSWITCH安装报错“You must install libyuv-dev to build mod_fsv”的解决方案
昨天下午安装FreeSWITCH时遇到该问题时,整了一个下午都没解决,也走了许多弯路.如果直接通过yum安装libyuv-devel时,会报错说找不到该安装包.后来又通过FreeSWITCH官网的网上 ...
- javascript实现kruskal算法
<script> //图的构建 function vnode() { this.visited = 0; this.vertex = 0; this.arcs = new Array(); ...
- 暂且解决INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误
有时候我们在APK安装时由于工程制定了UID,换过签名后可能出现 类似 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 或 INSTALL_FAILED_UPDATE_ ...
- 用js实现导航菜单点击切换选中时高亮状态
随着用户点击导航或菜单上不同的页面,出现此选项高亮显示或变为一个新的样式是经常用到的.实现它所用的原理就是通过js中的location.href得到当前页面的地址,然后在与导航上的链接地址匹对,相同的 ...
- SVG添加链接(转载)
转载地址:http://tech.techweb.com.cn/thread-258715-1-1.html 最基本的交互形式是链接.在 SVG 中,通过一个 <a> 标签提供链接,这与 ...