树形DP P1352 没有上司的舞会

洛谷P1352
有点像之前的股票买卖问题模型,但是有了一些选择的限制。即父亲和儿子的关系,因此需要使用数形DP来做。
思路如下:

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int w[6005],b[6005],ru[6005],cnt;
vector <int >a[6005]; 
int f[6005][2];
int x,y;
void  dfs(int u){
	f[u][1]=w[u];
	for(int i=0;i<a[u].size();i++){
		int son=a[u][i];
		dfs(son);
		f[u][1]+=f[son][0];
		f[u][0]+=max(f[son][1],f[son][0]);
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	for(int i=1;i<n;i++){
		cin>>x>>y;
		a[y].push_back(x);//vector记录儿子 
		ru[x]++;//用于后续判断根 
	}
	int root=1;
	while(ru[root]!=0){
		root++;
	}
	dfs(root);
	cout<<max(f[root][1],f[root][0]);
  return 0;
}




//  freopen("testdata.in", "r", stdin);
posted @ 2020-11-08 21:02  一个经常掉线的人  阅读(86)  评论(0)    收藏  举报