60pts求条
查看原帖
60pts求条
77763
徐子煊楼主2025/1/13 14:31

思路不太一样,我这里使用父节点是否去参加来做的,但是只有六十分,好像是几个比较大的数据不对?#2 #8 #9 #10

#include <bits/stdc++.h>
#define MAX_N 60005

using namespace std;
vector<int>nxt[MAX_N];
int r[MAX_N],n,root; //root旨在尋找誰是boss
int k,l;
int dp[MAX_N][2];

int work(int father,int w){ //w表示上司有沒有參加
	if (dp[father][w]) return dp[father][w];
	int ans0 = 0,ans1 = r[father];
	for (auto& i : nxt[father]) {
		ans0 += work(i,0); //not gonna join!
		if (!w) ans1 += work(i,1); // I join!
	}
	return dp[father][w] = (w ? ans0 : max(ans0,ans1));
}
int main(){
	cin >> n;
	for (int i = 1;i <= n;i++) cin >> r[i];
	for (int i = 1;i < n;i++) {
		cin >> l >> k;
		nxt[k].push_back(l); //l是k下屬
		if (!root || root == l) root = k;
	}
	cout << work(root,0) << endl;
	//for (int i = 1;i <= n;i++) cout << "下標 " << i << " 上司沒參加" << dp[i][0] << " 上司參加了" << dp[i][1] << endl;
	return 0;
}
2025/1/13 14:31
加载中...