类型:树形背包

传送门:>Here<

题意:给出一棵树,根节点在转播足球赛,每个叶子节点是一个观众在收看。每个叶子结点到根节点的路径权值之和是该点转播的费用,每个叶子节点的观众都会付val[i]的钱。先问在不亏本的前提下,最多转播多少观众

解题思路

$dp[u][i][j]$表示在以$u$为根节点的子树内,前$i$棵子树内选择$j$名观众的最大收益。这里的收益指的就是【所选观众交的钱 - 从$u$出发的转播费用总和】。从$u$出发就是指$u$以上的转播费用都不算

因此容易得到$dp[u][i][0]=0$(任何一个点不转播的收益都是0),为了一会儿打擂,其他权且置为$-∞$

在讲状态转移之前,先来回顾一下分组背包问题——物品已经分为几个组,题目要求每个组只能选择一个物品,使总价值最大。表面上看上去有点棘手,实际上就是一个01背包,只不过加了限定,一个组里只能选一个物品。因此正常的做法是遍历每一组,然后选择即可

那么当前这个问题可以转化为分组背包模型——每棵子树为一组,每组只能选择一个"物品"。这里的一组里的每个物品也就是"1个观众,2个观众,……"

因此易得转移方程$$dp[u][i][j]=Max\{dp[u][i-1][j-k] + dp[v][numson[v]][k] - cost[u \rightarrow v]\}$$注意要减去到达$v$的这一条边的费用。其中$numson[v]$是指$v$的直接儿子数量

观察可以发现$i$这一维可以滚动,因此可以优化为$$dp[u][j]=Max\{dp[u][j-k] + dp[v][k] - cost[u \rightarrow v]\}$$但是注意$j$要由$j-k$转移,因此$j$应当倒着扫。那$numson[v]$这一维可以舍去?因为$v$已经做完了,所以自然指的就是$numson[v]$了。

至于答案输出,我们只需要看$dp[1][q]$中满足$dp[1][q] \geq 0$的最大$q$就好了

Code

读入卡了我半天,这题的读入真奇特

/*By DennyQi 2018.8.14*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) + (x << ) + c - '', c = getchar(); return x * w;
}
int N,M,R,x,y,K,ans;
int first[MAXM],nxt[MAXM],to[MAXM],cost[MAXM],num_edge;
int val[MAXN],dp[MAXN][MAXN],size[MAXN];
inline void add(int u, int v, int w){
to[++num_edge] = v,cost[num_edge] = w,nxt[num_edge] = first[u],first[u] = num_edge;
}
int DP(int u, int _f){
int v,isleaf=,tot=;
if(u > N-M){ dp[u][] = val[u]; return ; }
for(int i = first[u]; i; i = nxt[i]){
if((v = to[i]) == _f) continue;
tot += DP(v, u);
for(int j = tot; j; --j)
for(int k = ; k <= j; ++k)
dp[u][j] = Max(dp[u][j], dp[u][j-k] + dp[v][k] - cost[i]);
}
return tot;
}
int main(){
memset(dp, -0x3f, sizeof(dp));
N = r, M = r;
for(int i = ; i <= N-M; ++i){
K = r;
for(int j = ; j <= K; ++j){
x = r, y = r;
add(i, x, y), add(x, i, y);
}
}
for(int i = ; i <= N; ++i) dp[i][] = ;
for(int i = N-M+; i <= N; ++i) val[i] = r;
DP(, -);
for(int i = ; i <= M; ++i) if(dp[][i] >= ) ans = Max(ans, i);
printf("%d", ans);
return ;
}

[洛谷P1273] 有线电视网的更多相关文章

  1. 洛谷 P1273 有线电视网

    2016-05-31 13:25:45 题目链接: 洛谷 P1273 有线电视网 题目大意: 在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[ ...

  2. 洛谷 P1273 有线电视网(树形背包)

    洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...

  3. 洛谷P1273 有线电视网 (树上分组背包)

    洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...

  4. 【题解】洛谷P1273 有线电视网(树上分组背包)

    次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...

  5. 洛谷——P1273 有线电视网

    P1273 有线电视网 题目大意: 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...

  6. C++ 洛谷 P1273 有线电视网 题解

     P1273 有线电视网  很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...

  7. 洛谷P1273 有线电视网 树上分组背包DP

    P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...

  8. 洛谷P1273 有线电视网 【树上分组背包】

    题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...

  9. 洛谷P1273 有线电视网【树形dp】

    题目:https://www.luogu.org/problemnew/show/P1273 题意:一棵树,叶子节点是用户,每天边有一个权值表示花费,每一个用户有一个值表示他们会交的钱. 问在不亏本的 ...

  10. 洛谷 P1273 有线电视网(dp)

    /* 想了半天没想出状态 自己还是太弱了 QAQ 题目问的是最多供给多少户 一般想法是把这个值定义为状态量 没想出来QAQ....看了看题解的状态 很机智.... f[i][j]表示i的子树 选了j个 ...

随机推荐

  1. 朱晔和你聊Spring系列S1E4:灵活但不算好用的Spring MVC

    阅读PDF版本 本文会以一些例子来展现Spring MVC的常见功能和一些扩展点,然后我们来讨论一下Spring MVC好用不好用. 使用SpringBoot快速开始 基于之前的parent模块,我们 ...

  2. 剑指offer--1.二维数组中的查找

    题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  3. Mysql启动找不到mysql.sock文件问题(Centos7)

    刚装完Mysql5.7,将Mysql添加到开机自启.reboot之后mysql服务却没启动起来, 直接输入mysql –uroot –p ,出现如下错误,找不到mysql.sock文件.用servic ...

  4. element ui主题色跟换

    node_modules\ element ui\ lib\ theme-dafault  下载的主题色替换掉改文件... ================== 但是会出现  搜索框iocon 样式换 ...

  5. vuex原理

    Vuex 框架原理与源码分析 vuex状态管理到底是怎样一个原理? 状态管理 Vuex框架原理与源码分析 Vuex实现原理解析 Vue刚出不久,Vuex 就出来了,想请教下Vuex做了什么事情? 个人 ...

  6. (Beta)Let's-M2后分析报告

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 在M1阶段我们对用户需求进行了调研,同时M1阶段我们的开发目标就是为了解决用户发起.参与.查看.搜 ...

  7. iOS蓝牙开发之iBeacon技术

    iBeacon组成信息: 1 .UUID(universally unique identifier):一个128位的唯一标识一个或多个Beacon基站为特定类型或特定的组织. 2. Major:一个 ...

  8. 用友云开放平台之API网关

    本文介绍选择API网关应考虑的几方面内容,API网关在微服务框架中的作用,API网关如何选型,用友云开放平台的API网关可以做什么. 随着互联网的快速发展,当前已步入移动互联.物联网时代.企业内部系统 ...

  9. 简约时尚商城wordpress主题-storefront

    wordpress主题:简约时尚商城主题-storefront 简简单的商城模板,挺适合一些懒人所用.后天功能也挺不错,希望大家喜欢. WooCommerce 集成 商城是基为用 WooCommerc ...

  10. Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...