P2014选课我的树形DP记忆化搜索如何跑得更快
查看原帖
P2014选课我的树形DP记忆化搜索如何跑得更快
84473
铁锤楼主2020/7/2 21:10

RT

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int w[310];
int head[310],nxt[610],to[610],cnt;
int dp[310][310];
void add(int u,int v) {
	cnt++;
	nxt[cnt]=head[u];
	to[cnt]=v;
	head[u]=cnt;
}
int dfs(int u,int fa,int num) {
	if(num==0) return 0;
	if(dp[u][num]) return dp[u][num];
	for(int i=1;i<=num;i++) {
		dp[u][i]=w[u];
	}
	for(int i=head[u];i;i=nxt[i]) {
		int v=to[i];
		if(v==fa) continue;
		for(int j=num;j>=1;j--) {
			for(int k=0;k<j;k++)
				dp[u][j]=max(dp[u][j],dfs(v,u,k)+dp[u][j-k]);
		}
	}
	return dp[u][num];
}
int main() {
	scanf("%d%d",&n,&m);
	int from,val;
	for(int i=2;i<=n+1;i++) {
		scanf("%d%d",&from,&val);
		from++;
		add(from,i);
		add(i,from);
		w[i]=val;
	}
	printf("%d",dfs(1,0,m+1));
	return 0;
}
2020/7/2 21:10
加载中...