TLE 77 分 求调
查看原帖
TLE 77 分 求调
389050
cszhpdx楼主2021/6/8 23:03

dp 状态看完题解发现是可以做的,代码也差不多,求调

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rp(i, e) for(int i=1;i<=(e);i++)
#define pr(i, e) for(int i=(e);i>=1;i--)
#define rp0(i, e) for(int i=0;i<(e);i++)
#define pr0(i, e) for(int i=(e)-1;i>=0;i--)
#define rps(i, b, e) for(int i=(b);i<=(e);i++)
#define prs(i, e, b) for(int i=(e);i>=(b);i--)
#define rpg(i, x) for(int i=head[x];i;i=e[i].nxt)
using namespace std;
const int NR=100, MR=500;
struct edge
{
	int to, w, nxt;
}e[MR];
int n, m, head[NR], cnt, f[NR][NR];
inline void add(int u, int v, int w){e[++cnt]=(edge){v, w, head[u]};head[u]=cnt;}
/*
假设以1为根
f[i][j]表示以i为根节点的子树,保留j条边的最大苹果数
f[i][j]=max(f[左孩子][k]+左孩子边权+f[右孩子][j-k]*右孩子边权)
*/
void dp(int x, int fa, int y)
{
	int lc=0, lwc=0, rc=0, rwc=0;
	rpg(i, x)
		if(e[i].to!=fa)
		{
			if(!lc)lc=e[i].to, lwc=e[i].w;
			else rc=e[i].to, rwc=e[i].w;
		}
	if(!lc && !rc)return;
	rps(k, 0, y)
	{
		if(lc && k)dp(lc, x, k-1);
		if(rc && y-k)dp(rc, x, y-k-1);
		f[x][y]=max(f[x][y], 
			(lc && k)*(f[lc][k-1]+lwc)+
			(rc && y-k)*(f[rc][y-k-1]+rwc));
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	int u, v, w;
	rp(i, n-1)
	{
		scanf("%d%d%d", &u, &v, &w);
		add(u, v, w), add(v, u, w);
	}
	dp(1, 0, m);
	printf("%d", f[1][m]);
	return 0;
}
2021/6/8 23:03
加载中...