有线电视网

某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。2≤N≤3000。

关于树形dp,有一个经典套路,就是n^3动归,从下到上枚举每个点,每个点下的孩子和一个值。这道题也不例外。设计状态\(dp[k][i][j]\)为,对于第i个点,用前k个儿子,满足j个客户的最大收益。于是状态转移方程就是:\(dp[k][i][j]=max(dp[k-1][i][p]+dp[k][i][j-p]\ (0\le p\le j)\)。观察一下这个状态和方程,它是一个多决策最优化问题,满足最优化原理,且无后效性。同时k是可以被滚动数组压缩的,从后往前循环枚举p即可。

#include <cstdio>
using namespace std; const int maxn=3005, maxm=3005, INF=1e9; struct Graph{
struct Edge{
int to, next, v; Graph *bel;
inline int operator *(){ return to; }
Edge& operator ++(){
return *this=bel->edge[next]; }
};
void addedge(int x, int y, int v){
Edge &e=edge[++cntedge];
e.to=y; e.next=fir[x]; e.v=v;
e.bel=this; fir[x]=cntedge;
}
Edge& getlink(int x){
return edge[fir[x]]; }
Edge edge[maxm*2];
int cntedge, fir[maxn];
}g; int n, m, size[maxn];
int dp[maxn][maxn]; inline int max(int x, int y){
return x<y?y:x; }
\
void predfs(int now, int par){
Graph::Edge e=g.getlink(now);
for (; *e; ++e){
if (*e==par) continue;
predfs(*e, now);
size[now]+=size[*e];
}
if (size[now]==0) size[now]=1;
} void dfs(int now, int par){
Graph::Edge e=g.getlink(now);
dp[now][0]=0; int cntsize=0;
for (; *e; ++e){ //枚举孩子
if (*e==par) continue; dfs(*e, now);
cntsize+=size[*e];
for (int j=cntsize; j>=0; --j) //总客户数
for (int p=cntsize-size[*e]; p>=0; --p) //前面的孩子中有几个客户
dp[now][j]=max(dp[now][j],
dp[now][p]+dp[*e][j-p]-((j-p)?e.v:0));
}
} void init(){
for (int i=0; i<maxn; ++i)
for (int j=0; j<maxn; ++j)
dp[i][j]=-INF;
} int main(){
init();
scanf("%d%d", &n, &m); int k, a, c;
for (int i=1; i<=n-m; ++i){
scanf("%d", &k);
for (int j=1; j<=k; ++j){
scanf("%d%d", &a, &c);
g.addedge(i, a, c);
}
}
for (int i=n-m+1; i<=n; ++i) scanf("%d", &dp[i][1]);
predfs(1, 0); dfs(1, 0); int pos;
for (pos=size[1]; pos>=0; --pos)
if (dp[1][pos]>=0) break;
printf("%d", pos); return 0;
}

有线电视网(树形dp)的更多相关文章

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

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

  2. luoguP1273 有线电视网 [树形dp]

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

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

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

  4. Luogu P1273 有线电视网 树形DP

    又重构了一下...当然当初的题一看就看懂了QAQ 设f[i][j]表示以i为根的子树,有j个客户的最大收益 方程:f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]-w(u ...

  5. Luogu 1273 有线电视网 - 树形背包

    Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移. Code #include<cstring> #include<cstdio> ...

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

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

  7. [luoguP1273] 有线电视网(DP)

    传送门 f[i][j]表示节点i选j个用户的最大收益 #include <cstdio> #include <cstring> #include <iostream> ...

  8. P1273 有线电视网[分组背包+树形dp]

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

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

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

随机推荐

  1. linux 常用shell脚本语句

    最近老大让写一个shell脚本,每天从一个固定IP中取到相应文件,所以想写一个简单的shell脚本命令,供大家学习交流.先做一个简单的例子,先看效果吧, 代码如下: #!/bin/sh #定义一个变量 ...

  2. 一篇文章教你如何用R进行数据挖掘

    一篇文章教你如何用R进行数据挖掘 引言 R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来.得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器 ...

  3. jsp和servlet的区别联系

    jsp和servlet的区别联系 简单的说,SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML ...

  4. hdu-5813 Elegant Construction(贪心)

    题目链接: Elegant Construction Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K (J ...

  5. codeforces 558C C. Amr and Chemistry(bfs)

    题目链接: C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input st ...

  6. OpenCV——Skewing

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  7. CodeForces - 311B:Cats Transport (DP+斜率优化)

    Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...

  8. 1111 Online Map (30)(30 分)

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  9. poj3017 Cut the Sequence[平衡树+单调队列优化]

    这里已经讲得很清楚了. 本質上是決策點與區間最大值有一定關係,於是用单调队列来维护决策集合(而不是常规的),然后在决策集合中选取最小值. 然后觉得这题方法还是很重要的.没写平衡树,用优先队列(堆)来维 ...

  10. js跨域请求方式 ---- JSONP原理解析

    这篇文章主要介绍了js跨域请求的5中解决方式的相关资料,需要的朋友可以参考下     跨域请求数据解决方案主要有如下解决方法:   1 2 3 4 5 JSONP方式 表单POST方式 服务器代理 H ...