POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)

题意:

公司参加聚会,要求员工不能和他的上司同时参加,求最多能参加几个人并且判断解是否唯一。

要点:

树型DP的经典题,用dp[u][1]表示选取u的最大值,dp[u][0]表示不选取u的最大值,容易得到状态转移方程为dp[u][1] += dp[v][0]和dp[u][0] += max(dp[v][1], dp[v][0]),可以看到如果dp[u][0]>dp[u][1]时,dp[v][1]==dp[v][0]会造成多解,那么我们最后遍历一遍即可判断是否有多解,还有一种情况是dp[0][1]==dp[0][0],这当然也有多解。这题用了map,稍微学了一下,还是很好用的。


15573797 Seasonal 3342 Accepted 212K 16MS C++ 1336B 2016-05-31 09:15:14
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
vector<int> edge[205];
int dp[205][2];

void dfs(int u,int p)
{
	int i, v;
	dp[u][0] = 0;//不取当前值
	dp[u][1] = 1;//取当前值
	for (i = 0; i < edge[u].size(); i++)
	{
		int v = edge[u][i];
		dfs(v, u);
		dp[u][1] += dp[v][0];
		dp[u][0] += max(dp[v][1], dp[v][0]);//这里状态转移会造成有不唯一的解
	}
}

int main()
{
	int n,i,j;
	char boss[200],a[200],b[200];
	map<string, int> mm;
	while (scanf("%d", &n), n)
	{
		mm.clear();
		for (i = 0; i < 205; i++)
			edge[i].clear();
		int tot = 0;
		scanf("%s", boss);
		mm[boss] = tot++;
		for (i = 0; i < n - 1; i++)
		{
			scanf("%s%s", a, b);
			if (mm.find(a) == mm.end()) mm[a] = tot++;
			if (mm.find(b) == mm.end()) mm[b] = tot++;//如果map中没有b,就把b加入,对应的映射是tot
			edge[mm[b]].push_back(mm[a]);
		}
		dfs(0, 0);
		bool flag = true;
		for (i = 0; i < n; i++)
		{
			flag = true;
			if (dp[i][0]>dp[i][1])//只有取dp[i][0]时可能有多解
			{
				for (j = 0; j < edge[i].size(); j++)
				{
					if (dp[edge[i][j]][0] == dp[edge[i][j]][1])
					{
						flag = false;
						break;
					}
				}
			}
			if (!flag)
				break;
		}
		printf("%d ", max(dp[0][0], dp[0][1]));
		if (!flag||dp[0][1]==dp[0][0])//还有一种是总体考虑boss要不要选造成的多解
			printf("No\n");
		else
			printf("Yes\n");
	}
	return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SeasonJoe/article/details/51543046
文章标签: acm dp 算法 poj
个人分类: POJ DP
上一篇例题5-4 UVa156 Ananagrams(STL:map)
下一篇POJ1351 Number of Locks(DP:记忆化搜索)
想对作者说点什么? 我来说一句

判断二元一次函数是否有解

2014年11月22日 951B 下载

MatLab解线性方程

2013年04月27日 94KB 下载

树型DP和状态压缩DP acm

2009年09月27日 173KB 下载

线性方程组的编程求解

2010年11月05日 508KB 下载

矩阵运算及解线性方程组工具

2012年06月20日 129KB 下载

唯一可译性编码判别程序

2013年06月16日 3KB 下载

Party Buffalo中文版

2015年08月22日 2.98MB 下载

python解数独

2018年02月21日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭