2016-05-31 13:25:45

题目链接: 洛谷 P1273 有线电视网

题目大意:

  在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[经过的边])>=0

解法:

  树状DP 背包DP

  DP[i][j]表示i号节点为根的子树中选择了j个叶子节点所得到的最大利润

  转移方程

    DP[i][j]=max(DP[i][j],DP[i][j-k]+DP[son][k]-cost[son][i]);

需要注意的地方

  写初始值的时候要注意除了DP[i][0]=0,全部都是-inf

 //有线电视网 (洛谷 No.1273)
//树状DP 背包DP
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=;
int DP[maxn][maxn];
struct edge
{
int to;
int cost;
int next;
edge(){}
edge(int to,int cost,int next):to(to),cost(cost),next(next){}
};
edge n[maxn];
int head[maxn];
int cnt;
void insert(int x,int y,int z)
{
n[++cnt]=edge(y,z,head[x]);
head[x]=cnt;
return ;
}
int N,M;
int val[maxn];
int DFS(int x)
{
if(x>N-M)
{
DP[x][]=val[x];
return ;
}
int sum=;
for(int i=head[x];i;i=n[i].next)
{
int size=DFS(n[i].to);
sum+=size;
for(int j=sum;j>=;j--)
{
for(int k=;k<=size;k++)
{
DP[x][j]=max(DP[x][j],DP[x][j-k]+DP[n[i].to][k]-n[i].cost);
}
}
}
return sum;
}
int main()
{
scanf("%d %d",&N,&M);
for(int i=;i<maxn;i++)
{
fill(DP[i],DP[i]+maxn,-);
}
for(int i=;i<=N;i++)DP[i][]=;
for(int i=;i<=N-M;i++)
{
int x;
scanf("%d",&x);
for(int j=;j<=x;j++)
{
int to,val;
scanf("%d %d",&to,&val);
insert(i,to,val);
}
}
for(int i=N-M+;i<=N;i++)
{
scanf("%d",&val[i]);
}
DFS();
for(int i=M;i>=;i--)
{
if(DP[][i]>=)
{
printf("%d",i);
return ;
}
}
return ;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. uva 10369

    数组开小了  还RE了一遍.......  最小生成树    按费用从小到大排... #include <iostream> #include <algorithm> #inc ...

  2. Linux---弹球游戏

    ReadMe: 弹球游戏按键说明(注意大小写): Q End Up Game 游戏停止 P Play Again  再玩一次 f 速度x轴方向减速 s 速度x轴方向加速 F 速度y轴方向减速 S 速度 ...

  3. hdu 4294 Multiple

    思路: 首先给出一个结论,就是最多用两个数就可以表示任何数的倍数. 证明 :对于一个数字a,可以构造出的数字有 a,aa,aaa,aaaa,aaaaa,…… 每一个数对于n都有一个余数,余数最多有n个 ...

  4. vim查找/替换字符串 及一些高级用法

    例: 32 ./run 0_39.pkt 0_39.jpg 33 ./run 0_3.pkt 0_3.jpg 34 ./run 0_40.pkt 0_40.jpg 35 ./run 0_41.pkt ...

  5. *J2EE中乱码处理

    发生中文乱码有三种情况 表单form (1)post 首先确定浏览器的编码方式,比如说utf-8,请求发给web服务器,web服务器以编码方式iso-9959-1来接收数据(服务器是外国人编写的),服 ...

  6. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  7. Uploadify 控件上传图片 + 预览

    jquery的Uploadify控件上传图片和预览使用介绍. 在简单的servlet系统中和在SSH框架中,后台处理不同的,在三大框架中图片预览时费了不少力气,所以下面将两种情况都介绍一下. 1,前台 ...

  8. 【转】Java多线程学习

    来源:http://www.cnblogs.com/samzeng/p/3546084.html Java多线程学习总结--线程概述及创建线程的方式(1) 在Java开发中,多线程是很常用的,用得好的 ...

  9. 蓝牙(3)如何通过蓝牙传输数据及UUID详介

    如何通过蓝牙传输数据 通过蓝牙传输数据与Socket类似.在网络中使用Socket和ServerSocket控制客户端和服务端的数据读写.而蓝牙通讯也由客户端和服务端Socket来完成.蓝牙客户端So ...

  10. Android开发之自定义组合控件

    自定义组合控件的步骤1.自定义一个View,继承ViewGroup,比如RelativeLayout2.编写组合控件的布局文件,在自定义的view中加载(使用View.inflate())3.自定义属 ...