洛谷P1273 有线电视网【树形dp】
题目:https://www.luogu.org/problemnew/show/P1273
题意:一棵树,叶子节点是用户,每天边有一个权值表示花费,每一个用户有一个值表示他们会交的钱。
问在不亏本的情况下,最多可以选择多少个用户,让他们得到从根节点(1)发送出的服务。
思路:本来很天真的以为是先dfs处理出每个叶子节点到根的净利润,然后背包。【太傻逼了】
但是同一棵子树上的节点共用了一段路径,这里是不用重复算的。
所以要树形dp,$dp[i][j]$表示以$i$为根的子树上选了$j$个节点。
$dp[i][j] = max(dp[i][j], dp[i][j-k]+dp[son][k]-e.w)$
$j$的范围是$i$的子孙数,这个需要dfs的时候统计,$k$的范围是$son$这棵子树的大小。
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n, m;
const int maxn = ;
int head[maxn], tot;
struct edge{
int to, w, nxt;
}e[maxn];
int pay[maxn];
int dp[maxn][maxn]; void add(int x, int y, int c)
{
e[++tot].to = y;
e[tot].w = c;
e[tot].nxt = head[x];
head[x] = tot;
} int dfs(int now)
{
if(now > n - m){
dp[now][] = pay[now];
return ;
}
int sum = , son = ;
for(int i = head[now]; i; i = e[i].nxt){
int to = e[i].to;
//printf("%d %d\n", now, e[i].to);
son = dfs(to);
sum += son;
for(int j = sum; j > ; j--){
for(int k = ; k <= son; k++){
if(j >= k)dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[to][k] - e[i].w);
}
}
}
return sum;
} int main()
{
memset(dp, ~0x3f, sizeof(dp));
memset(head, , sizeof(head));
scanf("%d%d", &n, &m);
for(int i = ; i <= n - m; i++){
int k;
scanf("%d", &k);
while(k--){
int a, c;
scanf("%d%d", &a, &c);
add(i, a, c);
}
dp[i][] = ;
}
for(int i = n - m + ; i <= n; i++){
scanf("%d", &pay[i]);
dp[i][] = ;
}
dfs();
for(int i = m; i > ; i--){
if(dp[][i] >= ){
printf("%d\n", i);
break;
}
}
}
洛谷P1273 有线电视网【树形dp】的更多相关文章
- 洛谷 P1273 有线电视网(dp)
/* 想了半天没想出状态 自己还是太弱了 QAQ 题目问的是最多供给多少户 一般想法是把这个值定义为状态量 没想出来QAQ....看了看题解的状态 很机智.... f[i][j]表示i的子树 选了j个 ...
- 洛谷 P1273 有线电视网(树形背包)
洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...
- 洛谷P1273 有线电视网 (树上分组背包)
洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...
- 洛谷 P1273 有线电视网
2016-05-31 13:25:45 题目链接: 洛谷 P1273 有线电视网 题目大意: 在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[ ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- P1273 有线电视网(树形dp)
P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. ...
- 【题解】洛谷P1273 有线电视网(树上分组背包)
次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...
- 洛谷——P1273 有线电视网
P1273 有线电视网 题目大意: 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...
- C++ 洛谷 P1273 有线电视网 题解
P1273 有线电视网 很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...
- Luogu P1273 有线电视网(树形dp+背包)
P1273 有线电视网 题面 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部 ...
随机推荐
- Beginning Linux Programming 学习-chapter2-Shell programming-Pipes and Redirection
"为了从事创造性工作,人类需要孤独,可是在孤独中,广义的人类仍存在于内心."--(德国)奥铿 ...
- 深入理解 Css3 的 clip-path
clip-path CSS 属性可以创建一个只有元素的部分区域可以显示的剪切区域.区域内的部分显示,区域外的隐藏.clip-path属性代替了现在已经弃用的剪切 clip属性.clip-path的属性 ...
- K8S从入门到放弃系列-(2)集群根证书准备
k8s从1.8版本开始,集群中各个组件需要使用TLS证书对通信进行加密,每个k8s集群都需要有独立的CA证书体系,这里我们采用比较常用的CloudFlare 的 PKI 工具集 cfssl 来生成 C ...
- python并发编程之协程(实践篇)
一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ...
- asp.net core-16.EF Core Migration
左边的是基于visual studio code 右边的是基于visual studio 如果想要在数据库的AspNetUsers表里添加一列 然后可以发现 在Data下的Migrations文件夹下 ...
- Bitbucket入门手册
老大要我去调研一下有什么好用的免费软件版本管理工具,有利于小团队开发的.我第一个想到的就是git,经常在git下东西,听说它的代码仓库好用,于是就注册了一个github的账号,创建仓库的时候才发现只能 ...
- (十四)Activitivi5之个人任务分配
一.个人任务分配 1.1 方式一:直接流程图配置中写死: 1.2 方式二:使用流程变量 我们在启动流程的时候设置流程变量即可 /** * 启动流程实例 */ @Test public void sta ...
- .htaccess 转 SAE AppConfig
新浪的SAE不支持 htaccess,但是他们开发了 AppConfig,可以完全代替 htaccess 的常见功能,AppConfig采用类自然语言的规则描述,还是很人性化的. 这里来写一个短网址的 ...
- Rider开发开发.NET Framework 4.5项目遇到的一些问题
使用rdier自带resharper功能,蛮爽的但是编译旧的项目时一直报错:Invalid option 'portable' for /debug; must be full or pdbonly' ...
- POJ1083(Moving Tables)--简单模拟
题目链接:http://poj.org/problem?id=1083 如图所示在一条走廊的两侧各有200个房间,现在给定一些成对的房间相互交换桌子,但是走廊每次只能通过一组搬运, 也就是说如果两个搬 ...