【题解】洛谷P1273 有线电视网(树上分组背包)
次元传送门:洛谷P1273
思路
一开始想的是普通树形DP 但是好像实现不大好
观摩了一下题解
是树上分组背包
设f[i][j]为以i为根的子树中取j个客户得到的总价值
我们可以以i为根有j组
在每一组中分别又取1个,2个,3个......n个客户
化为背包思想即 j为一共有j组 背包容量为每组的客户数总和 把该节点的每个儿子看成一组 每组中的元素为选一个,选两个...选n个用户
状态转移方程:
f[i][j]=max(f[i][j],f[i][j-k]+f[v][k]-边权);//i为根 j为容量
最后输出f[1][i]>=0的i的最大值 所以反向枚举
代码
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 3010
#define INF 1e9+7
int f[maxn][maxn];
int h[maxn],val[maxn];
int n,m,cnt;
struct Edge
{
int to;
int next;
int w;
}e[maxn*maxn];
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].next=h[u];
h[u]=cnt;
}
int dfs(int u)
{
if(u>n-m)//如果是叶子节点
{
f[u][]=val[u];//当前只能取一个客户 就是自己
return ;//返回几个客户
}
int t,sum=;//t为当前组有几个客户 sum为背包容量
for(int i=h[u];i;i=e[i].next)//枚举组
{
int v=e[i].to;
t=dfs(v);
sum+=t;
for(int j=sum;j>=;j--)//枚举容量 倒序
for(int k=;k<=t;k++)//枚举客户数量
{
if(j-k>=) f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]-e[i].w);
//满足背包容量大于客户数量才可以
}
}
return sum;
}
int main()
{
memset(f,~0x3f,sizeof(f));//初始化为一个极小负数 因为可能有负数
cin>>n>>m;
for(int i=;i<=n-m;i++)
{
int size;
cin>>size;
for(int j=;j<=size;j++)
{
int x,y;
cin>>x>>y;
add(i,x,y);
}
}
for(int i=n-m+;i<=n;i++) cin>>val[i];
for(int i=;i<=n;i++) f[i][]=;//初始化 取0个客户的花费为0
dfs();
for(int i=m;i>=;i--)//反向枚举
{
if(f[][i]>=)
{
cout<<i;
return ;
} }
}
https://www.luogu.org/problemnew/show/P1273
【题解】洛谷P1273 有线电视网(树上分组背包)的更多相关文章
- 洛谷P1273 有线电视网 (树上分组背包)
洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- 洛谷 P1273 有线电视网(树形背包)
洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...
- 洛谷 P1273 有线电视网
2016-05-31 13:25:45 题目链接: 洛谷 P1273 有线电视网 题目大意: 在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[ ...
- C++ 洛谷 P1273 有线电视网 题解
P1273 有线电视网 很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...
- 洛谷——P1273 有线电视网
P1273 有线电视网 题目大意: 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...
- 洛谷P1273 有线电视网 【树上分组背包】
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- 洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)
从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点 ...
- [洛谷P1273] 有线电视网
类型:树形背包 传送门:>Here< 题意:给出一棵树,根节点在转播足球赛,每个叶子节点是一个观众在收看.每个叶子结点到根节点的路径权值之和是该点转播的费用,每个叶子节点的观众都会付val ...
随机推荐
- 1..net mvc的原理概述
请求过来,根据ip和端口,由iis服务器进行接收,如果是静态文件则直接返回文件内容,如果无法解析,则根据映射规则找到对应请求后缀 的ASPNET_ISAPI.dll处理程序集,交由其进行处理. 1.此 ...
- php中模糊查询并关联三个select框
1.在php中我们经常用到下拉框,并相互关联,如果下拉框的option非常多,那么我们就要用到模糊搜索功能,那么怎么做呢? 在此功能中,走了弯路,最好不要关联两个select的id值后select属性 ...
- Django实现数据库中表格的增删查改
1.urls.py """Django_demo1 URL Configuration The `urlpatterns` list routes URLs to vie ...
- Linux下vim(文本编译器)的使用
vim (文本编译器): Vim是从 vi 发展出来的一个文本编辑器. vim的一些命令操作: 插入命令: a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行 ...
- eclipse 断点调试快捷键
(1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Too ...
- android 原生 MediaPlayer 和 MediaCodec 的区别和联系(三)
目录: (4)Android 官方网站 对 MediaCodec的介绍 注:编解码器特定数据(Code-specific Data,简写为csd) 部分结合网上资料加入了补充和个人理解.请悉知 ...
- SwipeRefreshLayout 报错 dispatchTouchEvent
今天开发android中使用了 android-suport-v4 19.1 记录 SwipeRefreshLayout 的坑: http://stackoverflow.com/questions/ ...
- return, break and continue
最近学习多线程看到了一个描述不太准确的地方,让我对return break continue个语句的不同开始详细了解了一番,之前只是知道怎么使用,不是很深入研究,基本遇到了跳出就用return来解决全 ...
- spring boot(5)-properties参数配置
application.properties application.properties是spring boot默认的配置文件,spring boot默认会在以下两个路径搜索并加载这个文件 s ...
- 使用 docker-machine 管理 Azure 容器虚拟机
安装 docker-machine 请参见该链接(https://docs.docker.com/machine/install-machine "https://docs.docker.c ...