简单的树形dp,我只有40pts,在线等
查看原帖
简单的树形dp,我只有40pts,在线等
461366
封禁用户楼主2021/8/8 15:07

树形dp新手QAQ

#include <bits/stdc++.h>
using namespace std;

const int N = 6e3 + 5;
int n, r[N], f[N][2];
vector<int> tre[N];
set<int> s;

void dp(int x, int y) {
	if (!y) {
		for (int i = 0; i < tre[x].size(); i++) {
			dp(tre[x][i], 0); dp(tre[x][i], 1);
			f[x][y] = max(f[x][y], f[x][y] + max(f[tre[x][i]][0], f[tre[x][i]][1]));
		}
	} else {
		for (int i = 0; i < tre[x].size(); i++) {
			dp(tre[x][i], 0);
			f[x][y] = max(f[x][y], f[x][y] + f[tre[x][i]][0]);
		}
		f[x][y] += r[x];
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> r[i];
	for (int i = 1; i <= n; i++) s.insert(i);
	for (int i = 1; i <= n - 1; i++) {
		int l, k;
		cin >> l >> k;
		s.erase(l);
		tre[k].push_back(l);
	}
	dp(*s.begin(), 1); dp(*s.begin(), 0);
	cout << max(f[*s.begin()][0], f[*s.begin()][1]) << endl;
	return 0;
} 
2021/8/8 15:07
加载中...