很久以前做的树形DP题,今天再遇到时,竟然不会了,所以写写。。

设数组:

prf[MAX][MAX],cost[MAX],sum[MAX]。分别表示,在第i个结点为根的子树内的情况下,若有j个用户申请看电视,所能得到的最大费用。cost表示传送到i点时所花的费用,而sum表示当前结点为根的子树内已访问的叶子结点的个数(即用户)。

 void dfs(int v,int fa){
if(T[v].size()>){
for(int i=;i<T[v].size();i++){
dfs(T[v][i],v);
}
}
if(T[v].size()==)
sum[v]=;
sum[fa]+=sum[v];
prf[fa][]=;
for(int i=sum[fa];i>;i--){
for(int j=sum[v];j>;j--){
if(prf[fa][i-j]!=-INF&&prf[v][j]!=-INF)
prf[fa][i]=max(prf[fa][i],prf[fa][i-j]+prf[v][j]-cost[v]);
}
}
}

使用深搜,再运用背包来解决。

for(int i=sum[fa];i>0;i--){

  for(int j=sum[v];j>0;j--){

    if(prf[fa][i-j]!=-INF&&prf[v][j]!=-INF)

      prf[fa][i]=max(prf[fa][i],prf[fa][i-j]+prf[v][j]-cost[v])

  }

}

枚举父结点当前已访问的用户数,再枚举当前结点子树内该问了的用户数,若要在父结点的状态中加入j个当前结点有用户,则

prf[fa][i]=max(prf[fa][i],prf[fa][i-j]+prf[v][j]-cost[v])。这是拿加入j个用户后与当前i个用户的费用的比较。

前提条件时if(prf[fa][i-j]!=-INF&&prf[v][j]!=-INF),因为要在状态存在的情况下才能进行。

 #include <iostream>
#include <vector> const int maxn=;
const int INF=;
using namespace std;
int n,m;
int prf[maxn][maxn];
int cost[maxn];
int sum[maxn]; vector<int>T[maxn]; void init(){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
prf[i][j]=-INF;
memset(cost,,sizeof(cost));
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
T[i].clear();
}
int max(int a,int b){
if(a<b)
return b;
return a;
}
void dfs(int v,int fa){
if(T[v].size()>){
for(int i=;i<T[v].size();i++){
dfs(T[v][i],v);
}
}
if(T[v].size()==)
sum[v]=;
sum[fa]+=sum[v];
prf[fa][]=;
for(int i=sum[fa];i>;i--){
for(int j=sum[v];j>;j--){
if(prf[fa][i-j]!=-INF&&prf[v][j]!=-INF)
prf[fa][i]=max(prf[fa][i],prf[fa][i-j]+prf[v][j]-cost[v]);
}
}
} int main(){
while(~scanf("%d%d", &n, &m))
{
init();
int t=,c,k,y;
T[].push_back();
while((++t)<=n-m){
scanf("%d",&k);
for(int i=;i<=k;i++){
scanf("%d%d",&y,&c);
T[t].push_back(y);
cost[y]=c;
}
}
for(k=n-m+;k<=n;k++){
scanf("%d",&c);
prf[k][]=c;
prf[k][]=;
}
dfs(,);
for(int i=m;i>=;i--)
if(prf[][i]>=){
printf("%d\n",i);
break;
}
}
return ;
}

POJ 1155的更多相关文章

  1. POJ 1155 树形背包(DP) TELE

    题目链接:  POJ 1155 TELE 分析:  用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理.        dp[cnt][i+j] = max( dp[cnt][i+j ...

  2. poj 1155 输入输出问题

    http://acm.hust.edu.cn/vjudge/problem/16417 重做了一遍poj 1155 题目大意:给定一棵树,1为根结点表示电视台,有m个叶子节点表示客户,有n-m-1个中 ...

  3. POJ 1155 (树形DP+背包+优化)

    题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...

  4. [POJ 1155] TELE (树形dp)

    题目链接:http://poj.org/problem?id=1155 题目大意:电视台要广播电视节目,要经过中转机构,到观众.从电视台到中转商到观众是一个树形结构,经过一条边需要支付成本.现在给你每 ...

  5. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  6. [POJ 1155] TELE

    TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3787   Accepted: 2007 Description ...

  7. POJ 1155 - TELE 树型DP(泛化背包转移)..

    dp[x][y]代表以x为根的子树..连接了y个终端用户(叶子)..所能获得的最大收益... dp[x][ ]可以看成当根为x时..有个背包空间为0~m...每个空间上记录了到到达这个空间的最大收益. ...

  8. poj 1155 TELE (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...

  9. poj 1155 TELE(树形DP)

    TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4863   Accepted: 2673 Description ...

  10. poj 1155 树形背包

    http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tre ...

随机推荐

  1. B1391 [Ceoi2008]order 最大权闭合图 最小割

    啊啊啊,假的题吧!!!我用的当前弧优化T了6个点,其他人不用优化AC!!!震惊!!!当前弧优化是假的吧!!! 到现在我也没调出来...大家帮我看看为啥70.... 来讲一下这个题的思路,就是设一个源点 ...

  2. Error-MySQL:2005 - Unknown MySQL server host 'localhost'(0)

    ylbtech-Error-MySQL:2005 - Unknown MySQL server host 'localhost'(0) 1.返回顶部 1. 今天在外面开navicat for mysq ...

  3. 数据结构C++,栈的实现

    #include <iostream>#include <cstdlib> template<class T>void changeLength1D(T*& ...

  4. 图结构练习—BFSDFS—判断可达性(BFS)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2138 注意该图为有向图,1000个点应该最多有 ...

  5. Django day13 form组件, 渲染错误信息, 全局钩子

    一:from组件 二:渲染错误信息 三:全局钩子

  6. α&β测试的定义及结束的标准

    α测试在系统开发接近完成时对应用系统的测试:测试后仍然会有少量的设计变更.这种测试一般由最终用户或其他人员完成,不能由程序或测试员完成. β测试当开发和测试根本完成时所做的用例,最终的错误和问题需要在 ...

  7. spring整合redis客户端及缓存接口设计

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

  8. sleep()和wait()的区别

    1 sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. 2 Thread.sleep和Object.wait都会暂停当前的线程,对于CP ...

  9. CSS画各种二维图形

    1.效果 2.源码 <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

  10. 使用 CSS 追踪用户

    原文地址:Crooked Style Sheets 作者:jbtronics 除了使用 JS 追踪用户,现在有人提出了还可以使用 CSS 进行网页追踪和分析,译者认为,这种方式更为 优雅,更为 简洁, ...