zoukankan      html  css  js  c++  java
  • POJ 3342 Party at Hali-Bula ——(树型DP)

      一开始用pii保存dp类型,写的很长,还是WA了= =。。

      然后参考了一下别人的博客,重新写了一发(似乎是岐哥的博客233)。

      代码如下:

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <string.h>
     4 #include <iostream>
     5 #include <string>
     6 #include <vector>
     7 #include <map>
     8 using namespace std;
     9 const int N = 200 + 5;
    10 
    11 int n;
    12 map<string,int> M;
    13 vector<int> G[N];
    14 int tot = 0;
    15 int dp[N][2];
    16 void dfs(int u)
    17 {
    18     dp[u][0] = 0;
    19     dp[u][1] = 1;
    20     for(int i=0;i<G[u].size();i++)
    21     {
    22         int v = G[u][i];
    23         dfs(v);
    24         dp[u][0] += max(dp[v][1], dp[v][0]);
    25         dp[u][1] += dp[v][0];
    26     }
    27 }
    28 
    29 int main()
    30 {
    31     while(scanf("%d",&n) == 1 && n)
    32     {
    33         for(int i=1;i<=n;i++) G[i].clear();
    34         tot = 0;
    35         M.clear();
    36         
    37         string boss;
    38         cin >> boss;
    39         M[boss] = ++tot;
    40         for(int i=1;i<n;i++)
    41         {
    42             string a,b;
    43             cin >> a >> b;
    44             if(M[a] == 0) M[a] = ++tot;
    45             if(M[b] == 0) M[b] = ++tot;
    46             int u = M[a], v = M[b];
    47             G[v].push_back(u);
    48         }
    49         
    50         dfs(1);
    51         printf("%d ",max(dp[1][0], dp[1][1]));
    52         int flag = dp[1][0] != dp[1][1];
    53         for(int i=1;i<=n&&flag;i++)
    54         {
    55             if(dp[i][0] < dp[i][1]) continue;
    56             for(int j=0;j<G[i].size()&&flag;j++)
    57             {
    58                 int v = G[i][j];
    59                 if(dp[v][1] == dp[v][0])
    60                 {
    61                     flag = 0;
    62                     break;
    63                 }
    64             }
    65         }
    66         puts(flag ? "Yes" : "No");
    67     }
    68     return 0;
    69 }

      想说明的一点是,博客里面的判断是否有多种可能的if条件应当是dp[i][0] >= dp[i][1],虽然两者都能AC,但是我觉得这样更加妥当一些。

  • 相关阅读:
    闭包
    函数进阶2
    文档翻译 Python 2.7.x和Python 3.x之间的主要区别(包括示例)
    Deep Learn 关于单维度模型的多维输出
    Deep Learning 名词解释
    Deep Learning 激活函数
    Deep Learning 归一化、标准化
    Deep Learning 梯度下降
    Deep Learning 循环神经网络
    Deep Learning BP反向传播
  • 原文地址:https://www.cnblogs.com/zzyDS/p/6629355.html
Copyright © 2011-2022 走看看