记录编号 256121 评测结果 AAAAAAAAAAAAA
题目名称 [Ural 1018] 二叉苹果树 最终得分 100
用户昵称 GravatarNewBee 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2016-04-29 11:51:04 内存使用 0.39 MiB
显示代码纯文本
#include<cstdio>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("ecappletree.in","r",stdin);freopen("ecappletree.out","w",stdout);chul();Cu;
using namespace std;
//designed by New_Beeؼ 
struct op{
	int lson,rson;
	op(){
		lson=rson=0;
	}
};
const int maxn=105;
int n,q;
op apt[maxn];
bool flag[maxn];
bool sk[maxn][maxn];
int nap[maxn][maxn];
int f[maxn][maxn];
void chul();
int getmax(int,int);
void build(int);
int DP(int,int);
void mem();
int main(){
	Begin;
}
void chul(){
	mem();
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++){
		int a,b,numap;
		scanf("%d%d%d",&a,&b,&numap);
		sk[a][b]=sk[b][a]=1;
		nap[a][b]=nap[b][a]=numap;
	}
	build(1);
	DP(1,q);
	printf("%d",f[1][q]);
}
void mem(){
	for(int i=0;i<maxn;i++){
		for(int j=0;j<maxn;j++)sk[i][j]=nap[i][j]=f[maxn][maxn]=0;
		flag[i]=0;
	}
}
void build(int rt){
	flag[rt]=1;
	for(int i=1;i<=n;i++){
		if(sk[rt][i]==1&&flag[i]!=1){
			if(apt[rt].lson==0)apt[rt].lson=i;
			else apt[rt].rson=i;
			build(i);
		}
	}
}
int DP(int rt,int nt){
	if(rt==0||nt==0)return 0;
	if(f[rt][nt]!=0)return f[rt][nt];
	f[rt][nt]=getmax(f[rt][nt],DP(apt[rt].lson,nt-1)+nap[rt][apt[rt].lson]);
	f[rt][nt]=getmax(f[rt][nt],DP(apt[rt].rson,nt-1)+nap[rt][apt[rt].rson]);
	int t=nap[rt][apt[rt].lson]+nap[rt][apt[rt].rson];
	for(int k=0;k<=nt-2;k++){
		f[rt][nt]=getmax(f[rt][nt],DP(apt[rt].lson,k)+DP(apt[rt].rson,nt-2-k)+t);
	}
	return f[rt][nt];
}
int getmax(int x,int y){
	if(x>y)return x;
	return y;
}