week13作業選做1 TT的蘋果樹 樹形DP/沒有上司的舞會

在這裏插入圖片描述
輸入樣例:

7
1
1
1
1
1
1
1
1 3
7 4
2 3
4 5
6 4
3 5
0 0

輸出樣例:

5

(雖然題目說的多組數據,但我試了下實際上只有一組數據。。。)
f[i][0]表示第i個人不去時最大的快樂值,f[i][1]表示第i個人去時最大的快樂值。
轉移方程:
f[i][0]+=max(f[j][0],f[j][1]),如果第i個人不去,那麼他的下屬,第j個人,可能去也可能不去
f[i][1]+=f[y][0],如果第i個人去,那麼他的下屬都不能去

完整代碼:

#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int N;
int happy[6100];
int f[6100][2];
int pa[6100];
vector<int> tree[6100];
void dfs(int x)
{
	f[x][0]=0;
	f[x][1]=happy[x];
	for(int i=0;i<tree[x].size();i++)
	{
		int y=tree[x][i];
		dfs(tree[x][i]);
		f[x][0]+=max(f[y][1],f[y][0]);
		f[x][1]+=f[y][0];
	}
}
int main()
{
	cin>>N;
	int a,b;
	memset(happy,0,sizeof(0));
	memset(pa,0,sizeof(0));
	for(int i=1;i<=N;i++)
	{		
		cin>>happy[i];
	}
	for(int i=1;i<=N-1;i++)
	{
		cin>>a>>b;
		tree[b].push_back(a);
		pa[a]=1; 
	}
	int root;
	for(int i=1;i<=N;i++)
	{
		if(pa[i]!=1)
			root=i;
	}
	dfs(root);
	cout<<max(f[root][0],f[root][1])<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章