树形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);

浙公网安备 33010602011771号