洛谷P1273 有线电视网 题解

题目链接:P1273 有线电视网

题意

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

从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。

现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。

写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。

如果直接去想怎么保证不超过边权和什么的不太好搞

考虑把每个用户数是否能够承担都算出来即可

也就是

设 dp[i][u][j]dp[i][u][j]dp[i][u][j] 表示以 uuu 为根的子树,仅用前 iii 个儿子,满足 jjj 个客户能获得的最大价值

事实上我们并不是非常关心是否能获得的最大价值,我们只要不亏本的情况下尽可能多让人看罢了(好良心有没有)

则有转移方程
dp[i][u][j]=max⁡(dp[i][u][j],dp[i−1][u][j−k]+dp[sz[v]][v][k]−w(u,v))dp[i][u][j]=\max(dp[i][u][j],dp[i-1][u][j-k]+dp[\text{sz}[v]][v][k]-w(u,v)) dp[i][u][j]=max(dp[i][u][j],dp[i−1][u][j−k]+dp[sz[v]][v][k]−w(u,v))
可以发现这个东西可以滚动数组优化

然后就有
dp[u][j]=max⁡(dp[u][j],dp[u][j−k]+dp[v][k]−w(u,v))dp[u][j]=\max(dp[u][j],dp[u][j-k]+dp[v][k]-w(u,v)) dp[u][j]=max(dp[u][j],dp[u][j−k]+dp[v][k]−w(u,v))

sz[u]+=sz[v];
for(int j=sz[u]; j>=0; j--)for(int k=1; k<=min(sz[v],j); k++)dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-e[i].w);

AC?不,这样会TLE。参考讨论 link

因为这样的复杂度并不能保证为严格 O(n2)O(n^2)O(n2) 的,这也就是所谓的实现不好。

改成下面的刷表法就好了
dp[u][j+k]=max⁡(dp[u][j+k],dp[u][j]+dp[v][k]−w(u,v))dp[u][j+k]=\max(dp[u][j+k],dp[u][j]+dp[v][k]-w(u,v)) dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]−w(u,v))

for(int j=0; j<=sz[u]; j++)tmp[j]=dp[u][j];
for(int j=0; j<=sz[u]; j++)for(int k=0; k<=sz[v]; k++)dp[u][j+k]=max(dp[u][j+k],tmp[j]+dp[v][k]-e[i].w);

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(3e3+15)int n,m,dp[N][N];
struct Edge
{int u,v,w,next;
}e[N<<1];
int pos=1,head[N],sz[N],val[N],tmp[N];
void addEdge(int u,int v,int w)
{e[++pos]={u,v,w,head[u]};head[u]=pos;
}
void dfs(int u,int f)
{sz[u]=1;if(u>n-m) dp[u][1]=val[u];for(int i=head[u]; i; i=e[i].next){int v=e[i].v;if(v==f)continue;dfs(v,u);//ACfor(int j=0; j<=sz[u]; j++)tmp[j]=dp[u][j];for(int j=0; j<=sz[u]; j++)for(int k=0; k<=sz[v]; k++)dp[u][j+k]=max(dp[u][j+k],tmp[j]+dp[v][k]-e[i].w);sz[u]+=sz[v];// TLE// sz[u]+=sz[v];// for(int j=sz[u]; j>=0; j--)//     for(int k=1; k<=min(sz[v],j); k++)//         dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-e[i].w);}
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// freopen("check.in","r",stdin);// freopen("check.out","w",stdout);cin >> n >> m;for(int i=1; i<=n-m; i++){int k;cin >> k;for(int j=1,v,w; j<=k; j++){cin >> v >> w;addEdge(i,v,w);addEdge(v,i,w);}}for(int i=n-m+1; i<=n; i++)cin >> val[i];memset(dp,0xc0,sizeof(dp));for(int i=1; i<=n; i++)dp[i][0]=0;dfs(1,1);for(int i=m; i>=0; i--)if(dp[1][i]>=0)return cout << i,0;return 0;
}

转载请说明出处

洛谷P1273 有线电视网 题解相关推荐

  1. 洛谷 P1273 有线电视网

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

  2. 洛谷P1273 有线电视网

    题目链接 题意概述:一颗以1为根节点的树,树上路径权值为负,叶子节点权值为正,定义权值和为根结点到叶子结点上的路径边权+叶子点权,在权值和为非负数的情况下最多到达多少叶子节点. 拿到题目第一眼莫名觉得 ...

  3. [洛谷原创]有线电视网

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

  4. 洛谷-1273 有线电视网

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

  5. 洛谷1273有线电视网

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

  6. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  7. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  8. 洛谷P4568 [JLOI2011] 飞行路线 题解

    洛谷P4568 [JLOI2011] 飞行路线 题解 题目链接:P4568 [JLOI2011] 飞行路线 题意: Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公 ...

  9. 洛谷P3426 [POI2005]SZA-Template 题解

    洛谷P3426 [POI2005]SZA-Template 题解 题目链接:P3426 [POI2005]SZA-Template 题意:你打算在纸上印一串字母. 为了完成这项工作,你决定刻一个印章. ...

最新文章

  1. opencv实现图像的拼接功能
  2. Python之web开发(六):python使用django框架搭建网站之登陆页搭建不同页面之间跳转
  3. mysql利用cpu率高_MySQL高CPU使用率
  4. 两类传输协议:TCPUDP总结
  5. VMware虚拟机12安装linux系统
  6. 【Blog.Core重要升级】:封装服务扩展层
  7. leetcode 面试题 17.21. 直方图的水量(单调栈)
  8. 高强度的加密软件怎么制作
  9. Linux的c编程-文件节点的打开与读写操作
  10. C语言按位取反~的简单理解
  11. DP1363F国产NFC射频前端芯片替代CLRC663/RC522
  12. app支付宝接入流程图_支付宝资金预授权开通免押租赁系统,芝麻信用免押租赁app/小程序...
  13. 腾讯云直播生成 推流地址 拉流地址
  14. 下载python开发环境
  15. 洛谷P4495 奇怪的背包 [HAOI2018] 数论
  16. 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目异同(上)
  17. JAVA编程基础(四)开启Java语言编程之旅
  18. nacos access log日志占用磁盘
  19. Elasticsearch通过_update_by_query和script批量修改文档
  20. RISC-V入门笔记(新手必看!)

热门文章

  1. rust被禁播还能玩吗_被强制下架的5部剧,后2部因“尺度太大”被禁播,如今已恢复上架...
  2. C语言提取一个数的千位百位十位个位
  3. C语言/C++常见习题问答集锦(六十四) 之兔子繁殖(递归与非递归)
  4. vue2+element ui 导入和导出后端传过来的文件
  5. XPO 的三篇介绍文章。
  6. iPhone记步和Android计步,手机中运动步数是如何计算的?
  7. 旷视科技一面 2022.0804
  8. IDEA代码放大缩小快捷键设置、注释、标识符以及关键字。
  9. 教程:BootToGecko系统虚机与实机开发环境搭建及FirefoxOS设备使用和开发网站推荐;
  10. mysql 启动失败 详情_mysql启动失败一例