POJ 1155 TELE 树形dp

原创 2012年03月27日 20:40:56

http://poj.org/problem?id=1155

题意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端,其余点为转发站。客户端i愿支付的钱为pay[i],每一条边需要的花费固定,问电台在保证不亏损的情况下,最多能使多少个客户端接收到信息?广播台所在的节点编号为1。

思路:树形dp。 用dp[root][d] 表示以root为根的子树中,保留d个用户的最大利润,由于每个结点的孩子的数目并不是最多只有两个,因此在求dp[root][d]的时候要进行一次横向的dp,即对root的所有孩子进行一个背包,在具体实现的时候我们可以一次求出root的所有可能d的最大利润(在背包dp的时候一起求出)。

需要注意的几点:1、树最好用邻接矩阵存储,这样可以节约寻找root孩子的时间;

     2、用一个num[ ]数组存储每个root状态数, 即d的最大值,这样比每次都从M开始求用时会少,避免超时。


代码:

#include<stdio.h>
#include<string.h>
#define INF 100000000
#define MAX(a,b) (a) > (b) ? (a) : (b)
int N ,M ;
int pay[3010] ;
int dp[3010][3010] ;
struct Node{
	int d ; 
	int next ;
	int n ;	
}edge[3010] ;
int root[3010] ;
int cnt ;
int num[3010] ;			//存放每个结点的状态种数 

void dfs(int u){
	if(u > N-M){
		num[u] = 1 ;
		dp[u][1] = pay[u] ;
		return ;	
	}	
	dp[u][0] = 0 ;
	for(int i=root[u]; i!=-1; i=edge[i].next){
		int v = edge[i].n ;
		int d = edge[i].d ;
		dfs(v) ;
		num[u] += num[v] ;
		for(int j=num[u];j>=0;j--){			//孩子的背包 
			for(int k=1;j-k>=0 && k<=num[v];k++){
				dp[u][j] = MAX(dp[u][j] , dp[u][j-k]+dp[v][k]-d );	
			}
		}
	}
}
void add(int u , int v, int d){
	edge[cnt].d = d ;
	edge[cnt].n = v ;
	edge[cnt].next = root[u] ;
	root[u] = cnt ++ ;	
}
int main(){
	int a , b ,c ,i, j ;
	while(scanf("%d %d",&N,&M) == 2){
		memset(root , -1  ,sizeof(root) );
		cnt = 0 ;
		for(i=1;i<=N-M;i++){
			scanf("%d",&a);	
			for(j=0;j<a;j++){
				scanf("%d %d",&b,&c);
				add(i,b,c);
			}
		}	
		for(i=N-M+1;i<=N;i++){
			scanf("%d",&pay[i]);				
		}
		for(int i=1;i<=N;i++){
			for(int j=0;j<=M;j++)
				dp[i][j] = -INF ;	
		}
		memset(num , 0 ,sizeof(num));
		dfs(1) ;
		for(int i=num[1];i>=0;i--){
			if(dp[1][i] >= 0){
				printf("%d\n",i);
				break ;	
			}	
		}      
	}	
	return 0 ;	
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

树形DP______TELE( POJ 1155 )

Description A TV-network plans to broadcast an important football match. Their network of transmi...

POJ1155:TELE(树形DP)

Description A TV-network plans to broadcast an important football match. Their network of transmitt...

[POJ1155]TELE(树形dp)

要一直走下去,直到生命终止的那一刻。

POJ1155 TELE【树形dp(背包)】

Apple TreeTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 10035Accepted: 3338DescriptionWsh...

POJ 1155 TELE 树形DP

题意:给你一棵树,root为电视台,每个叶子节点为潜在的用户,其他节点为为讯号传播的中转站,每条边都有权值,如果信号发送到某个叶子节点,将收到用户交的费用,但是经过的边都要消耗费用,问最多能发送到几个...

poj 1155 TELE(树形泛化背包dp)

/*     这道题还不错,自己想出了思路过得也比较快,也得出了一个小经验,以后写这种题先把关键部分伪代码写出来这样会快很多而且     不那么容易出错,省去很多的调试时间     这道题就是转...

poj1155 TELE(树形dp+背包)

TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4344   Accepted:...
  • d_x_d
  • d_x_d
  • 2015-11-16 20:06
  • 1321

POJ1155 TELE(树形DP)

题目大意: 一个电视台转播比赛,电视网络类似于树,树的节点为中转站或者用户 节点的编号为1~N,其中1为总站,2到(N-M)为中转站,(N-M+1)到N为用户 节点到节点间转移信号需要给定的费用,且每...

POJ1155---TELE(树形dp,背包)

Description A TV-network plans to broadcast an important football match. Their network of transmitt...

POJ1155TELE (树形DP)

Description A TV-network plans to broadcast an important football match. Their network of transmi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)