poj3342Party at Hali-Bula(树形dp)

简介:

/*
   树形dp!
   判重思路:
   当dp[v][0]==dp[v][1]时,很自然,flag[u][0]必然是有两种方案的。flag[u][1]则不然,
   因为它只和dp[v][0]有关系。而若flag[v][0]不唯一时,则必然flag[u][1]也不唯一
   也就是u的子节点有dp[v][1]==dp[v][0](选与不选都一样),那么父节点u不选的时候一定会有
   多种方案!也就是flag[u][0]=false; 否则如果flag[v][0]==flase(子节点不选的时候有多种方案),
   那么父节点u选择的时候一定有多种方案,则flag[u][1]=false;
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<map>
#include<algorithm>
#define N 205
using namespace std;

map<string, int>mp;
int n;
int cnt;
int g[N][N];
int dp[N][2];
bool flag[N][2];
map<string, int>::iterator it;

void dfs(int u){
   for(int v=1; v<=n; ++v)
       if(g[u][v]){
          dfs(v);
          dp[u][1]+=dp[v][0];
          dp[u][0]+=max(dp[v][1], dp[v][0]);
          if(dp[v][1]==dp[v][0]) flag[u][0]=false;
          if(flag[v][0]==false) flag[u][1]=false;
       } 
}

int main(){
   string na1, na2;
   while(scanf("%d", &n) && n){
       mp.clear();
       memset(g, 0, sizeof(g));
       cnt=0;
       cin>>na1;
       mp[na1]=++cnt;
       for(int i=1; i<n; ++i){
           dp[i][1]=1;
           dp[i][0]=0;
           flag[i][1]=flag[i][0]=true;
           cin>>na1>>na2;
           it=mp.find(na1);
           if(it==mp.end())
              mp[na1]=++cnt;
           it=mp.find(na2);
           if(it==mp.end())
               mp[na2]=++cnt;
           g[mp[na2]][mp[na1]]=1; 
       }
       dp[n][1]=1;
       dp[n][0]=0;
       flag[n][1]=flag[n][0]=true;
       dfs(1); 
       if(dp[1][1]>dp[1][0] && flag[1][1]) printf("%d %s\n", dp[1][1], "Yes");
       else if(dp[1][0]>dp[1][1] && flag[1][0]) printf("%d %s\n", dp[1][0], "Yes");
       else printf("%d %s\n", max(dp[1][0], dp[1][1]), "No");
   }
   return 0;
}

目录
相关文章
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
172 0
NowCoder | KY11 二叉树遍历
NowCoder | KY11 二叉树遍历
|
算法 测试技术
每日一题:LeetCode-LCR 143.子结构判断
每日一题:LeetCode-LCR 143.子结构判断
poj 3624 Charm Bracelet(简单01背包)
Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the maximum possible sum of ratings.
54 0
poj 1088 记忆化搜索||动态规划
记忆化搜索也也是采用递归深搜的对数据进行搜索,但不同于直接深搜的方式,记忆化搜索是在每次搜索时将得到的结果保存下来,避免了重复计算,这就是所谓的记忆化。记忆化应该是属于动态规划。
55 0
|
网络架构
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
|
机器学习/深度学习 C++
【PAT甲级 - C++题解】1151 LCA in a Binary Tree
【PAT甲级 - C++题解】1151 LCA in a Binary Tree
86 0
|
C++
【PAT甲级 - C++题解】1086 Tree Traversals Again
【PAT甲级 - C++题解】1086 Tree Traversals Again
74 0
P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组(poj3261)
P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组(poj3261)
133 0
|
人工智能 Java
HDU-敌兵布阵(线段树 || 树状数组)
HDU-敌兵布阵(线段树 || 树状数组)
104 0

热门文章

最新文章