poj1155
题意:给定一个树形图,节点数量3000。叶子节点是用户,每个用户如果能看上电视会交一定的电视费。看上电视的条件是从根到该用户的路径全部被修好,修每条边有一个费用。在不亏损(用户交钱总额>=修路总费用)的前提下,最多有多少人能看上电视。
分析:树形dp。dp[u][i][j]表示对于u节点,只看其前i个儿子对应的子树,在这些子树中总共让j个用户看上电视,这样的最大利润是多少(可以为负值)。
那么dp[u][i][j]=max(dp[u][i-1][j], dp[v][num[v][k] + dp[u][i - 1][j - k] - cost(u, v));其中v是u第i个儿子,num[v]表示以v为根的子树中总共有多少用户,cost(u,v)表示u到v这条边需要的花费。
以上是非叶子节点的转移方法,对于叶子节点则稍有不同,直接赋值为该用户交的钱即可。
#include <cstdio>
#include <vector>
using namespace std; #define D(x) const int INF = 0x3f3f3f3f;
const int MAX_N = (int)(3e3) + ; int n, m;
int money[MAX_N];
vector<pair<int, int> > edge[MAX_N];
int dp[MAX_N][MAX_N];
int num[MAX_N];
int sum[MAX_N]; void input()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n - m; i++)
{
int k;
scanf("%d", &k);
for (int j = ; j < k; j++)
{
int a, c;
scanf("%d%d", &a, &c);
edge[i].push_back(make_pair(a, c));
}
}
for (int i = n - m + ; i <= n; i++)
{
scanf("%d", &money[i]);
}
} void dfs(int u, int cost)
{
if (u > n - m)
{
dp[u][] = ;
num[u] = ;
sum[u] = money[u];
dp[u][] = money[u];
return;
} num[u] = ;
sum[u] = ;
for (int i = ; i < (int)edge[u].size(); i++)
{
int v = edge[u][i].first;
int w = edge[u][i].second;
dfs(v, w);
num[u] += num[v];
sum[u] += sum[v];
}
fill_n(dp[u], num[u] + , -INF);
dp[u][] = ;
for (int i = ; i < (int)edge[u].size(); i++)
{
int v = edge[u][i].first;
int w = edge[u][i].second;
for (int j = num[u]; j >= ; j--)
{
int limit = min(j, num[v]);
for (int k = ; k <= limit; k++)
{
dp[u][j] = max(dp[u][j], dp[v][k] + dp[u][j - k] - w);
}
}
}
} int main()
{
input();
dfs(, );
int ans = ;
for (int i = ; i <= num[]; i++)
{
if (dp[][i] >= )
ans = max(ans, i);
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= num[i]; j++)
{
D(printf("dp[%d][%d]=%d\t", i, j, dp[i][j]));
}
D(puts(""));
}
printf("%d\n", ans);
return ;
}
poj1155的更多相关文章
- [POJ1155]TELE
[POJ1155]TELE 试题描述 A TV-network plans to broadcast an important football match. Their network of tra ...
- poj1155 TELE (树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...
- poj1155 TELE (树上的背包)
题目链接:http://poj.org/problem?id=1155 题意:给定一棵树,1为根结点表示电视台,有m个叶子节点表示客户,有n-m-1个中间节点表示中转站,每条树边有权值.现在要在电视台 ...
- POJ1155 TELE(树形DP)
题目是说给一棵树,叶子结点有负权,边有正权,问最多能选多少个叶子结点,使从叶子到根的权值和小于等于0. 考虑数据规模表示出状态:dp[u][k]表示在u结点为根的子树中选择k个叶子结点的最小权值 最后 ...
- POJ-1155 TELE (树形DP+分组背包)
题目大意:给一棵带边权的有根树,每个叶子节点有权.边权表示代价,叶子节点的权值代表可以补偿多少代价.问从根节点最多可以到达多少个叶子,使得付出的总代价不大于0. 题目分析:定义状态dp(u,k)表示从 ...
- POJ1155 - TELE(树形DP)
题目大意 电视台要直播一场比赛,电视网络刚好形成了一棵树,其中有M个为客户端,其他的为中转站,其中中转站与中转站以及中转站与客户端之间连接都需要一定费用,每个客户i愿意支付pay[i]元钱,问电视台在 ...
- poj1155(树形dp)
题目链接:http://poj.org/problem?id=1155 题意:电视台要直播一场比赛,电视网络刚好形成了一棵树,其中有M个为客户端,其他的为中转站,其中中转站与中转站以及中转站与客户端之 ...
- poj1155 依赖背包
/* 依赖背包 dp[i][j]表示i结点为根的树选择j个用户时的最大剩余费用 即背包容量是j,价值是最大费用 */ #include<iostream> #include<cstr ...
- 树形DP+背包(poj1155泛化分组背包)
TELE Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3675 Accepted: 1936 Description ...
随机推荐
- 使用Robomongo 连接MongoDB 3.x 报 Authorization failed 解决办法(转)
最近安装了mongodb3.1.4,并启用了权限验证,在dos窗口下操作没有任何问题,为了维护方便就下载了一个客户端工具Robomongo 0.8.5,用户名.密码的等配置好点解测试,结果连接服务没有 ...
- motto2
Baby you've done enough that cut your breath.Don't beat yourself up don't need to turn so fast.Somet ...
- git项目开发版本控制实践
linux和bsd: 第一, bsd, berkeley software distribution, 伯克利软件套装, 是最开始的unix是开放的, 然后berkeley对unix进行了修改, 形成 ...
- php对uploads文件的处理问题的解决
解决uploads问题的要点有几点: 参考这篇文章 第一, 在php.ini文件中, 有file_uploads这一节 file_uploads = On ;是否开启文件上传功能, 该功能有很大的安全 ...
- virtualbox 中的linux 共享文件 发生文件系统类型错误的解决办法
转自:http://blog.csdn.net/ls1160/article/details/24913391 最近在研究linux下的安卓源代码编译,遇到了一些问题,在虚拟机的共享文件上. 因为联网 ...
- 7 天玩转 ASP.NET MVC — 第 1 天
0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET M ...
- glusterFS的常用命令 (转)
1. 启动/关闭/查看glusterd服务 # /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /etc/init.d/g ...
- #define 中#和##的作用
#的作用是把后面的参数变成一个字符串. 如,#define f(a) #a f(hello world)相当于"hello world": ##的作用是把两个字符串连接起来. 如, ...
- XDU 1161 - 科协的数字游戏II
Problem 1161 - 科协的数字游戏II Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 112 ...
- PHP中PSR-[0-4]代码规范
PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR-[0-4] ...