85分求助!
查看原帖
85分求助!
536809
秋天的小溪123楼主2023/7/29 16:41
#include<iostream>
#include<cstdio> 
using namespace std;
int n,q,map[105][105],f[105][105],l[105],r[105],a[105];

const int SIZE=1<<14;
char getc()
{
	static char buf[SIZE],*begin=buf,*end=buf;
	if(begin==end)
	{
		begin=buf;
		end=buf+fread(buf,1,SIZE,stdin);
	}
	return *begin++; 
}
int read()
{
	int ret=0,sgn=0,ch=getc();
	while(!isdigit(ch))	sgn|=ch=='-',ch=getc();
	while(isdigit(ch))	ret=ret*10+ch-'0',ch=getc();
	return sgn?-ret:ret;
}

void mt(int v)
{
	for(int i=1;i<=n;i++)
	{
		if(map[v][i]>=0)
		{
			l[v]=i;
			a[i]=map[v][i];
			map[v][i]=-1;
			map[i][v]=-1;
			mt(i);
			break;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(map[v][i]>=0)
		{
			r[v]=i;
			a[i]=map[v][i];
			map[v][i]=-1;
			map[i][v]=-1;
			mt(i);
			break;
		}
	}
}

int dp(int x,int y)
{
	if(y==0)	return 0;
	if(l[x]==0&&r[y]==0)	return a[x];
	if(f[x][y]!=0)	return f[x][y];
	
	for(int i=0;i<=y-1;i++)
		f[x][y]=max(f[x][y],dp(l[x],i)+dp(r[x],y-i-1)+a[x]);
	return f[x][y];
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	n=read();
	q=read();
	q++;
	for(int i=1;i<=n;i++)	for(int j=1;j<=n;j++)	map[i][j]=-1;
	int xxx,yyy,zzz;
	for(int i=1;i<=n-1;i++)
	{
		xxx=read();
		yyy=read();
		zzz=read();
		map[xxx][yyy]=zzz;
		map[yyy][xxx]=zzz;
	}
	
	mt(1);
	cout<<dp(1,q);
	return 0;
}
2023/7/29 16:41
加载中...