HDU 1011 Starship Troopers

31 篇文章 0 订阅

树形dp

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>

using namespace std;

#define sf scanf
#define pf printf
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define dbg(x) cerr << "Line:" <<  __LINE__ << " : " << #x << " = " << (x) << endl
#define nMax 1000
#define ll long long

int n,m;
int bugs[nMax],dp[110][110],val[nMax];
int first[nMax],nxt[nMax],to[nMax],e;
int vis[nMax];

void addadge(int u,int v) {
	to[e]=v;nxt[e]=first[u];first[u]=e;e++;
	to[e]=u;nxt[e]=first[v];first[v]=e;e++;
}
int inline max(int a,int b) { return a > b ? a : b ; }

void dfs(int u) {
	rep(i,m+1) if(i >= bugs[u]) dp[u][i]=val[u]; else dp[u][i]=0;
	vis[u] = 1;

	for(int i=first[u],v;i!=-1;i=nxt[i])if(!vis[v=to[i]]) {
		dfs(v);
		for(int j=m;j>=bugs[u];j--) {
			for(int k=1;k<=j-bugs[u];k++){
				dp[u][j] = max(dp[u][j],dp[v][k] + dp[u][j-k]);
			}
		}
	}
}

void work() {
	rep(i,n) {
		bugs[i] = bugs[i]/20 + (bugs[i]%20==0?0:1);
	}
	memset(vis,0,sizeof(vis));
	dfs(0);
	int ans = 0;
	for(int i=0;i<=m;i++) ans = max(ans,dp[0][i]);
	if(m==0) ans = 0;
	pf("%d\n",ans);
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif
	
	while(sf("%d%d",&n,&m)) {
		if( n==-1 && m==-1 ) break;
		e = 0;
		memset(first,-1,sizeof(first));
		rep(i,n) sf("%d%d",&bugs[i],&val[i]);
//		dbg(val[0]);
		int u,v;
		rep(i,n-1) {
			sf("%d%d",&u,&v);
			addadge(u-1,v-1);
		}
		work();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值