hdoj 1520 Anniversary Party

33 篇文章 0 订阅

Anniversary Party

树形dp,采用左儿子右兄弟的方式来存储,然后采用递归的方式dp。动规方程很简单,类似于01背包的情况。这里就不在写了。具体的见程序。程序如下:

/*
ID :csuchenan
PROG: hdoj 1520 Anniversary party
LANG: C++
*/

#include<stdio.h>
#define MAXN 6010

struct Node{
	int far ;
	int bro ;
	int chl ;
	
	int take ;
	int nott ;
	
	int maxval(){
		return take > nott ? take : nott ;
	}
	
	void init(){
		far = 0 ;
		bro = 0 ;
		chl = 0 ;
		take = 0 ;
		nott = 0 ;
	}
}node[MAXN] ;

int n ;

bool init() ;
void work() ;
void dfs(int);

int main(){
	
	while(init())
		work() ;
	return 0 ;
}

bool init(){
	
	if(scanf("%d" , &n)!=1)
		return 0 ;
	
	int i ;
	
	for(i = 1 ; i <= n ; i ++){
	
		node[i].init() ;
		scanf("%d" , &node[i].take) ;
	}
	
	int p ;
	int q ;

	scanf("%d %d" , &p , &q) ;
		
	while(p && q){
		
		node[p].far = q ;
		node[p].bro = node[q].chl ;
		node[q].chl = p	;
		scanf("%d %d" , &p , &q) ;
	}
	
	return 1 ;
}

void work(){
	
	int i ;
	
	for(i = 1 ; i <= n ; i ++){
		if(!node[i].far){
			dfs(i) ;
			break  ;
		}
	}
	
	printf("%d\n" , node[i].maxval()) ;
	return ;
}
void dfs(int index){
	
	int child = node[index].chl ;
	
	while(child){
		
		dfs(child) ;
		
		node[index].take += node[child].nott ;
		node[index].nott += node[child].maxval() ; 
		child = node[child].bro ;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值