题目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$这棵子树的大小。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<map>
  4. #include<set>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<vector>
  8. #include<cmath>
  9. #include<stack>
  10. #include<queue>
  11. #include<iostream>
  12.  
  13. #define inf 0x3f3f3f3f
  14. using namespace std;
  15. typedef long long LL;
  16. typedef pair<int, int> pr;
  17.  
  18. int n, m;
  19. const int maxn = ;
  20. int head[maxn], tot;
  21. struct edge{
  22. int to, w, nxt;
  23. }e[maxn];
  24. int pay[maxn];
  25. int dp[maxn][maxn];
  26.  
  27. void add(int x, int y, int c)
  28. {
  29. e[++tot].to = y;
  30. e[tot].w = c;
  31. e[tot].nxt = head[x];
  32. head[x] = tot;
  33. }
  34.  
  35. int dfs(int now)
  36. {
  37. if(now > n - m){
  38. dp[now][] = pay[now];
  39. return ;
  40. }
  41. int sum = , son = ;
  42. for(int i = head[now]; i; i = e[i].nxt){
  43. int to = e[i].to;
  44. //printf("%d %d\n", now, e[i].to);
  45. son = dfs(to);
  46. sum += son;
  47. for(int j = sum; j > ; j--){
  48. for(int k = ; k <= son; k++){
  49. if(j >= k)dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[to][k] - e[i].w);
  50. }
  51. }
  52. }
  53. return sum;
  54. }
  55.  
  56. int main()
  57. {
  58. memset(dp, ~0x3f, sizeof(dp));
  59. memset(head, , sizeof(head));
  60. scanf("%d%d", &n, &m);
  61. for(int i = ; i <= n - m; i++){
  62. int k;
  63. scanf("%d", &k);
  64. while(k--){
  65. int a, c;
  66. scanf("%d%d", &a, &c);
  67. add(i, a, c);
  68. }
  69. dp[i][] = ;
  70. }
  71. for(int i = n - m + ; i <= n; i++){
  72. scanf("%d", &pay[i]);
  73. dp[i][] = ;
  74. }
  75. dfs();
  76. for(int i = m; i > ; i--){
  77. if(dp[][i] >= ){
  78. printf("%d\n", i);
  79. break;
  80. }
  81. }
  82. }

洛谷P1273 有线电视网【树形dp】的更多相关文章

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

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

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

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

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

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

  4. 洛谷 P1273 有线电视网

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

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

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

  6. P1273 有线电视网(树形dp)

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

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

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

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

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

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

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

  10. Luogu P1273 有线电视网(树形dp+背包)

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

随机推荐

  1. Java Script 学习日志 Div

    2019年7月7日 学习网站: http://www.w3school.com.cn/js/js_examples.asp 1.输出 1. 1首先就是输出看 <script> docume ...

  2. Windows下jmap命令报错问题

       最近换了笔记本,新的工作环境下jmap命令居然在报错,而jps.jstat.jinfo.jstack都能正常使用,所以初步排除进程号的问题. Attaching to core 17536 fr ...

  3. 用js实现菜单的下拉列表,实用又简单

    下拉列表本可以用<select>配合<option>来写,方便得很.但是在前端中,好用的东西都有兼容,为了避免出现兼容性的问题,下拉列表用js写再合适不行了. <body ...

  4. 阿里云Centos7 搭建laravel

    最近在考虑学习laravel框架,唔 现在服务器搭建一下. laravel是依赖composer的,首先在linux服务器下先安装composer.运行composer需要 php 5.3以上版本, ...

  5. 基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究

    基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究 2015-09-23 | 作者:所级中心基因组平台 张兵 [关闭] 近日,基因组所所级中心基因组平台三代单分子实时测序PacB ...

  6. Django自定义指令+mq消息队列的使用

    import pika import json import logging import base64 from rest_framework.exceptions import ParseErro ...

  7. jQuery组件封装之return this.each(function () {});

    记录一下自己的调试历程 组件封装经常看到这么一段代码 $.fn.plugin = function (options) { return this.each(function (i,t) { new ...

  8. 谷歌浏览器调试手机app内置网页

    当自己的H5项目内置于手机app内时,遇到了样式问题或者想查看H5页面代码.数据交互以及缓存等情况来检查数据,此时可以使用谷歌浏览器的控制台远程调试手机,步骤如下: 一.手机开启允许usb调试 二.手 ...

  9. gentoo use-flag 全局标识 大全 (官方搬运) 英文 适用funtoo

    连接 https://www.gentoo.org/support/use-flags/ 提示 ctrl+F 可在页面查找 搬运 Global USE flags FlagDescription 3d ...

  10. ubuntu16.04安装aquatone

    很坑   网上的那些教程 不知道怎么搞得....  误人子弟 首先 一台服务器  ubuntu16.04 首先aquatone   github  https://github.com/michenr ...