#122-[树形动态规划]LazyChild黑OJ

版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/83011035

Description

LazyChild开了一家“善良OJ”。但大多数人都不知道,这其实是家黑OJ。亲爱的同学,请不要惊讶,古时候有黑店,现代为什么不能有黑OJ呢?每AC一道题,网站便会自动在电脑上安装一种木马。LazyChild通过窃取信息获取收益(如网游帐号、OI资料、YuanY和TT的照片等等)。

作为一名资深黑客,老Z某日突然发现,“善良OJ”上的木马,自己电脑上都没有。这可十分让他过意不去。老Z决定通过多A题,来丰富自己电脑的病毒库。

经过调查,老Z发现,很多木马是不能共存的。比如“和谐”木马与“团结”木马,两者只能任选其一。然而,老Z是个完美主义者,他想要自己的病毒库尽可能充实。

老Z不懈的追求最终感动了上天。天上的神仙(半仙?)“牛人雨”给这个问题稍稍降低了一点难度。神仙规定,对于n种木马,有且仅有(n-1)对不能共存,并且对于每种木马,都存在至少一个木马与之不能共存。

老Z不在乎自己AC多少题。请告诉他,他最多能从“善良OJ”上获取木马的个数。

Input

第一行,一个正整数n,表示木马个数。

剩余(n-1)行,每行一对木马,表示他们不能共存。(保证相同的木马可以共存,任意不同两行的描述不等价)

木马编号从0至(n-1)

Output

一行,老Z最多获得木马的个数。你可以认为开始时没有任何木马。

Sample Input

3
0 1
1 2

Sample Output

2

HINT

 

【数据规模】

扫描二维码关注公众号,回复: 3635986 查看本文章

对于100%的数据,1<=n<=200

如果这个点选了,它的儿子就不能选.

否则随便.

#include <iostream>
#include <vector>

#define SIZE 210

using namespace std;

vector<int> graph[SIZE];
int dp[SIZE][2];

void dfs(int u, int pre) // DP过程
{
	int i, v;
	
	dp[u][1] = 1; // 边界条件
	for (i = 0; i < graph[u].size(); ++i)
	{
		v = graph[u][i];
		if (v != pre)
		{
			dfs(v, u);
			dp[u][0] += max(dp[v][0], dp[v][1]); // 如果这个点没选,它的儿子选不选随便
			dp[u][1] += dp[v][0]; // 如果这个点选了,它的儿子就不能选.
		}
	}
	
	return;
}

int main(int argc, char** argv)
{
	int n, u, v;
	
	scanf("%d", &n);
	while (--n)
	{
		scanf("%d%d", &u, &v);
		graph[u].push_back(v); // 建图
		graph[v].push_back(u);
	}
	
	dfs(0, -1);
	
	printf("%d", max(dp[0][0], dp[0][1]));
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/83011035