UVA 1220 Party at Hali-Bula——dp
2018-03-13 19:51
429 查看
紫书P282讲得很明白#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
const int maxn = 500;
int n, tot = 0;
vector<int> G[maxn];
map<string, int> m;
bool judge[maxn][2];
int dp[maxn][2];
void dfs(int u) {
if (G[u].size() == 0) {
dp[u][0] = 0;
dp[u][1] = 1;
judge[u][0] = judge[u][1] = true;
return;
}
dp[u][1] = 1;
dp[u][0] = 0;
judge[u][1] = judge[u][0] = true;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
dfs(v);
dp[u][1] += dp[v][0];
judge[u][1] &= judge[v][0];
if (dp[v][0] > dp[v][1]) {
dp[u][0] += dp[v][0];
judge[u][0] &= judge[v][0];
}
else if (dp[v][0] < dp[v][1]) {
dp[u][0] += dp[v][1];
judge[u][0] &= judge[v][1];
}
else {
dp[u][0] += dp[v][0];
judge[u][0] = false;
}
}
}
int main() {
//freopen("out.txt", "w", stdout);
while (~scanf("%d", &n) && n) {
for (int i = 1; i <= n; i++) G[i].clear();
m.clear();
tot = 0;
string s1, s2;
cin >> s1;
if (!m[s1]) m[s1] = ++tot;
for (int i = 1; i <= n - 1; i++) {
cin >> s1 >> s2;
if (!m[s1]) m[s1] = ++tot;
if (!m[s2]) m[s2] = ++tot;
G[m[s2]].push_back(m[s1]);
}
dfs(1);
bool res;
int ans;
if (dp[1][0] > dp[1][1]) ans = dp[1][0], res = judge[1][0];
else if (dp[1][0] < dp[1][1]) ans = dp[1][1], res = judge[1][1];
else ans = dp[1][0], res = false;
printf("%d ", ans);
if (res) printf("Yes\n");
else printf("No\n");
}
return 0;
}
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
const int maxn = 500;
int n, tot = 0;
vector<int> G[maxn];
map<string, int> m;
bool judge[maxn][2];
int dp[maxn][2];
void dfs(int u) {
if (G[u].size() == 0) {
dp[u][0] = 0;
dp[u][1] = 1;
judge[u][0] = judge[u][1] = true;
return;
}
dp[u][1] = 1;
dp[u][0] = 0;
judge[u][1] = judge[u][0] = true;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
dfs(v);
dp[u][1] += dp[v][0];
judge[u][1] &= judge[v][0];
if (dp[v][0] > dp[v][1]) {
dp[u][0] += dp[v][0];
judge[u][0] &= judge[v][0];
}
else if (dp[v][0] < dp[v][1]) {
dp[u][0] += dp[v][1];
judge[u][0] &= judge[v][1];
}
else {
dp[u][0] += dp[v][0];
judge[u][0] = false;
}
}
}
int main() {
//freopen("out.txt", "w", stdout);
while (~scanf("%d", &n) && n) {
for (int i = 1; i <= n; i++) G[i].clear();
m.clear();
tot = 0;
string s1, s2;
cin >> s1;
if (!m[s1]) m[s1] = ++tot;
for (int i = 1; i <= n - 1; i++) {
cin >> s1 >> s2;
if (!m[s1]) m[s1] = ++tot;
if (!m[s2]) m[s2] = ++tot;
G[m[s2]].push_back(m[s1]);
}
dfs(1);
bool res;
int ans;
if (dp[1][0] > dp[1][1]) ans = dp[1][0], res = judge[1][0];
else if (dp[1][0] < dp[1][1]) ans = dp[1][1], res = judge[1][1];
else ans = dp[1][0], res = false;
printf("%d ", ans);
if (res) printf("Yes\n");
else printf("No\n");
}
return 0;
}
相关文章推荐
- Party at Hali-Bula UVA - 1220 (简单树形dp)
- 紫书动规 例题9-13 UVA - 1220 Party at Hali-Bula 树形dp
- uva1220Party at Hali-Bula(树形dp)
- UVA 1220 Party at Hali-Bula (树形DP)
- UVa 1220 Party at Hali-Bula (树形DP,最大独立集)
- Party at Hali-Bula(UVA - 1220) 树形dp 最大独立集
- UVa 1220:Party at Hali-Bula(DP)
- UVA1220Party at Hali-Bula(树形dp)
- UVA 1220 / HDOJ 2412 Party at Hali-Bula 树形DP
- uva 1220 Party at Hali-Bula 树形DP
- uva 1220 - Party at Hali-Bula 【入门树形dp】
- 100道动态规划——36 UVA 1220 Party at Hali-Bula 树形DP 最大独立集 思考欠妥
- UVA - 1220 Party at Hali-Bula(树形dp)
- UVa - 1220 - Party at Hali-Bula ( 树形DP 求最大独立集 )
- 【UVa1220】Party at Hali-Bula(树形DP)
- UVA - 1220 Party at Hali-Bula 树形DP入门
- UVA 1220 Party at Hali-Bula (树形dp--树的最大独立集)
- Uva-1220-Party at Hali-Bula
- POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 1220 Party at Hali-Bula(树型动态规划)
- UVa1220 - Party at Hali-Bula