求助:感觉思路没错但是一分没得
查看原帖
求助:感觉思路没错但是一分没得
300078
pengyule楼主2020/6/13 20:58
#include <bits/stdc++.h>
using namespace std;
int n,Q,a,b,c;
struct node {
	int left,right;//左子编号、右子编号
	int lbr,rbr;//左边边,右边边
}nodes[105];
int book[105],vis[105][105];
int e[105][105];
int f[105][105];
int maxsize[105];
void Bfun(int step){
	int x=1;
	for(int i=1;i<=n;i++) if(book[i]==0){
		book[i]=1;
		if(x) nodes[step].left=i,nodes[step].lbr=e[step][i],x--;
		else nodes[step].right=i,nodes[step].rbr=e[step][i];
		Bfun(i);
	}
}
int dfs(int step){
	if(nodes[step].left==0 && nodes[step].right==0){ 
		maxsize[step]=1; 
	    return 1;
	}
	maxsize[step]=dfs(nodes[step].left)+dfs(nodes[step].right)+1;
	return maxsize[step];
}
int dp(int i,int j){
	if(vis[i][j]) return f[i][j];
	if(j==0) { vis[i][j]=1; f[i][j]=0; return 0; }
	if(nodes[i].left==0 && nodes[i].right==0) return 0;
	if(maxsize[nodes[i].left]+maxsize[nodes[i].right]<j) return 0;
	vis[i][j]=1;
	if(maxsize[nodes[i].left]>maxsize[nodes[i].right]) swap(nodes[i].left,nodes[i].right),swap(nodes[i].lbr,nodes[i].rbr);
	for(int k=maxsize[nodes[i].left]+1;k>=0 && j-k<=maxsize[nodes[i].right]+1 && j-k>=0;k--)
		if(k>0 && j-k>0) f[i][j]=max(f[i][j],dp(nodes[i].left,k-1)+dp(nodes[i].right,j-k-1)+nodes[i].lbr+nodes[i].rbr);
		else if(k==0) f[i][j]=max(f[i][j],dp(nodes[i].right,j-k-1)+nodes[i].rbr);
		else f[i][j]=max(f[i][j],dp(nodes[i].left,k-1)+nodes[i].lbr);
	return f[i][j];
}
int main()
{
	cin>>n>>Q;
	for(int i=1;i<=n-1;i++) cin>>a>>b>>c,e[a][b]=e[b][a]=c;
	Bfun(1);
	dfs(1);
	for(int i=1;i<=n;i++) maxsize[i]--;
	cout<<dp(1,Q)<<endl;
	return 0;
}

谢谢帮助

2020/6/13 20:58
加载中...