本文主要是介绍基础算法学习---树状dp,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
没有上司的舞会
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 6010;
int hp[N];
int e[N],h[N],ne[N],idx;
int f[N][2];
bool hf[N];
int n;
//邻接表建树
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
void dfs(int u){
//dp赋值
f[u][1] = hp[u];
//遍历子节点
for(int i = h[u];i != -1;i = ne[i]){
int j = e[i];
//子节点更新
dfs(j);
//选不选父节点
f[u][1] += f[j][0];
f[u][0] += max(f[j][1],f[j][0]);
}
}
int main(){
cin >> n;
for(int i = 1;i <= n;i ++) cin >> hp[i];
memset(h,-1,sizeof h);
for(int i = 1;i < n;i ++){
int a,b;
cin >> a >> b;
//b为a的父亲
add(b,a);
hf[a] = 1;
}
//找根节点
int rt = 1;
while(hf[rt]) rt ++;
//根节点开搜
dfs(rt);
cout << max(f[rt][0],f[rt][1]);
}
这篇关于基础算法学习---树状dp的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!