zoukankan      html  css  js  c++  java
  • hdu2412 Party at HaliBula

    http://acm.hdu.edu.cn/showproblem.php?pid=2412

    树状DP,找出树中互不相邻的点,最多能有多少个,判断是否唯一比较麻烦

    不涂即为白色,黑色表示选择该点

    不唯一的涂色方法可以分为以下两种树:

    1.(如果根节点为白色,最多的涂色方法)dp[i][0]  有多种的树

    2.(如果根节点为黑色,最多的涂色方法)dp[i][1]  有多种的树

    形成1类型树方法:

    如果根节点为白色,它的子树中有任意一个满足下面条件:

    dp[j][0] == dp[j][1] 

    或 (dp[j][0] > dp[j][1] 且 该子树为1类型树)

    或 (dp[j][1] > dp[j][0] 且 该子树为2类型树)

    形成2类型树方法:

    如果根节点为白色,它的子树中有任意一个是1类型树:

      1 #include <stdio.h>
      2 #include <iostream>
      3 #include <string>
      4 #include <vector>
      5 #include <map>
      6 
      7 using namespace std;
      8 
      9 vector<int> p[210];
     10 vector<int>::iterator it;
     11 int n, dp[210][2], mark[210][2];
     12 
     13 void dfs(int x)
     14 {
     15     int i, j, sum1, sum2;
     16     if(p[x].empty())
     17     {
     18         dp[x][0] = 0;
     19         dp[x][1] = 1;
     20         mark[x][0] = mark[x][1] = 0;
     21         return;
     22     }
     23     sum1 = 0; //don't choose
     24     sum2 = 1; //choose
     25     for(i=0; i<p[x].size(); i++)
     26     {
     27         j = p[x][i];
     28         dfs(j);
     29         if(dp[j][1] > dp[j][0] && mark[j][1])
     30         {
     31             mark[x][0] = 1;
     32         }
     33         if(dp[j][0] > dp[j][1] && mark[j][0])
     34         {
     35             mark[x][0] = 1;
     36         }
     37         if(dp[j][0] == dp[j][1])
     38         {
     39             mark[x][0] = 1;
     40         }
     41         if(mark[j][0])
     42         {
     43             mark[x][1] = 1;
     44         }
     45         sum1 += max(dp[j][0], dp[j][1]);
     46         sum2 += dp[j][0];
     47     }
     48     dp[x][0] = sum1;
     49     dp[x][1] = sum2;
     50 }
     51 
     52 int main()
     53 {
     54     string s, s1, s2;
     55     map<string, int> map1;
     56     int i, temp1, temp2;
     57     while(scanf("%d", &n), n)
     58     {
     59         for(i=1; i<=n; i++)
     60         {
     61             mark[i][0] = mark[i][1] = 0;
     62             p[i].clear();
     63         }
     64         map1.clear();
     65         cin >> s;
     66         map1.insert(make_pair(s, 1));
     67         i = 2;
     68         n = n - 1;
     69         while(n-- && cin >> s1 >> s2)
     70         {
     71             if(map1.find(s1) == map1.end())
     72             {
     73                 map1.insert(make_pair(s1, i));
     74                 i = i + 1;
     75             }
     76             if(map1.find(s2) == map1.end())
     77             {
     78                 map1.insert(make_pair(s2, i));
     79                 i = i + 1;
     80             }
     81             temp1 = map1[s1];
     82             temp2 = map1[s2];
     83             p[temp2].push_back(temp1);
     84         }
     85         dfs(1);
     86         if(dp[1][0] == dp[1][1])
     87         {
     88             printf("%d No\n", dp[1][0]);
     89             continue;
     90         }
     91         if(dp[1][0] > dp[1][1])
     92         {
     93             printf("%d ", dp[1][0]);
     94             printf(mark[1][0]? "No\n": "Yes\n");
     95             continue;
     96         }
     97         if(dp[1][0] < dp[1][1])
     98         {
     99             printf("%d ", dp[1][1]);
    100             printf(mark[1][1]? "No\n": "Yes\n");
    101         }
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    EfCore基本用法
    C#笔试题目总结
    LINQ
    markdown 语法
    打造一款 刷Java 知识的小程序(二)
    为了考PMP,我做了一个刷题小程序
    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
    反制面试官 | 14张原理图 | 再也不怕被问 volatile!
    50+道大厂JVM面试题 + 11张思维导图就是让你懂JVM~
    【从零开始用Swift开发一个iOS应用(仿微博)】开篇-1. demo上手体验
  • 原文地址:https://www.cnblogs.com/yuan1991/p/hdu2412.html
Copyright © 2011-2022 走看看