社区讨论

0分求调

P2014[CTSC1997] 选课参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj3k37o
此快照首次捕获于
2025/11/03 20:09
4 个月前
此快照最后确认于
2025/11/03 20:09
4 个月前
查看原帖
帮帮我一下,我刚学树上dp
CPP
#include<iostream>
#include<vector>
using namespace std;

vector<int>to[310];
int dp[310][310];
int vis[310];
int s[310];
int siz[310];
int n,m;

void dfs(int n){
	vis[n]=true;
	if(to[n].empty())dp[n][1]=s[n],siz[n]=1;
	int k=to[n].size();
	
	for(int i=0;i<k;i++){
		int e=to[n][i];
		if(!vis[e])dfs(e);
		siz[n]+=siz[e];	
	}
	
	for(int t=0;t<k;t++){
		int e=to[n][t];
		for(int i=m;i>0;i--){
			for(int j=0;j<=min(i,siz[e]);j++){
				dp[n][i]=max(dp[n][i],dp[n][i-j]+dp[e][j]);	
			}
		}
	}
	siz[n]++;
	for(int i=m;i>0;i--){
		dp[n][i]=max(dp[n][i],dp[n][i-1]+s[n]);
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int k;
		cin>>k>>s[i];
		to[k].push_back(i);
	}
	dfs(0);
	cout<<dp[0][m]<<endl;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...