您的位置:首页 > 其它

POJ 3342(树形dp)

2016-08-17 10:11 281 查看
wa

#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>

using namespace std;
const int INF = 0x3f3f3f3f;
string employee[205];
int len;
vector<int> list[205];
int dp[205][2];
int n;

int find(string str)
{
int i;
for (i = 0; i<len; i++)
{
if (employee[i] == str)
return i;
}
employee[len] = str;
return len++;
}

void dfs(int father)
{
for (int i = 0; i < list[father].size(); i++)
{
int child = list[father][i];
if (list[child].size()>0)
dfs(child);
dp[father][0] +=max(dp[child][0], dp[child][1]);
dp[father][1] += dp[child][0];
}
}

int main()
{
//freopen("in.txt", "r", stdin);
while (cin >> n, n)
{
memset(dp, 0, sizeof(dp));
len = 0;
for (int i = 0; i <= n; i++)
{
list[i].clear();
}
string str;
cin >> str;
int x = find(str);
for (int i = 2; i <= n; i++)
{
string str1, str2;
str1.clear();
str2.clear();
cin >> str1;
cin >> str2;
int a, b;
a = find(str1);
b = find(str2);
list[b].push_back(a);
}
for (int i = 0; i < n; i++)
{
dp[i][1] = 1;
}
dfs(0);
int Max = -INF;
int count = 1;
bool flag = true;;
if (dp[0][0] == dp[0][1])
{
flag = false;
}
if (flag)
{
cout << max(dp[0][0], dp[0][1]) << " Yes" << endl;
}
else
{
cout << max(dp[0][0], dp[0][1]) << " No" << endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp poj 树形dp 动态规划