P1352 没有上司的舞会题解(树形DP + 数)
查看原帖
P1352 没有上司的舞会题解(树形DP + 数)
1005667
housiqiao楼主2024/8/29 10:59
这道题典型的树形DP
s[i][0]表示第i个人来可以获得的价值(其下属),s[i][1]表示第i个人不来可以获得的价值(其下属),s[u][0] += max(s[a][0], s[a][1]),s[u][1] += s[a][0]

注意本题有连通分量,可能存在很多总上司,因此在最后求和时,需判断当前节点是否为它所在树的根节点

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
const int N = 6000 + 10;
long long n, sum = 0, R[N], s[N][2];
bool vis[N], flag[N];
vector<int> v[N];
void dfs(int u) {
	vis[u] = true;
	s[u][0] = 0;
	s[u][1] = R[u];
	for (auto a : v[u]) {
		if (vis[a] == false)	dfs(a);
		s[u][0] += max(s[a][0], s[a][1]);
		s[u][1] += s[a][0];
	}
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> R[i];
		vis[i] = false;
		flag[i] = false;
	}
    for (int i = 1; i <= n - 1; i++) {
        long long L, K;
        cin >> L >> K;
        flag[L] = true;
        v[K].push_back(L);
    }
	for (int i = 1; i <= n; i++) {
		if (vis[i])	continue;
		dfs(i);
		if (flag[i] == false)	sum += max(s[i][0], s[i][1]);
	}
	cout << sum << '\n';   
	return 0;
}
2024/8/29 10:59
加载中...