• HDU 1520 Anniversary party


    题目意思:有n个人,他们的关系是一棵树,每个人有一个欢乐度,举行一个聚会,邀请个人里的一些人,但是如果两个人的关系是上下级,他们最多一个被邀请

    int dp[][2]     dp[][0]表示不邀请这个人得到的最大欢乐度,dp[][1]表示邀请这个人得到的最大欢乐度

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<set>
     6 #include<vector>
     7 #include<map>
     8 #include<algorithm>
     9 #include<cmath>
    10 #include<stdlib.h>
    11 using namespace std;
    12 int dp[6200][2];
    13 vector<int >ko[6200];
    14 int n,pe[6200],fa[6200],ben,vit[6200][2];
    15 int dfs(int pos,int way)
    16 {
    17     if(ko[pos].size()==0)
    18     {
    19         if(way)
    20         dp[pos][way]=pe[pos];
    21         else
    22         dp[pos][way]=0;
    23         return dp[pos][way];
    24     }
    25     if(vit[pos][way])
    26     return dp[pos][way];
    27     if(way)
    28     dp[pos][way]+=pe[pos];
    29     for(int i=0;i<ko[pos].size();i++)
    30     {
    31         int to=ko[pos][i];
    32         if(way==0)
    33         {
    34             dp[to][0]=dfs(to,0);
    35             dp[to][1]=dfs(to,1);
    36             vit[to][0]=vit[to][1]=vit[pos][0]=1;
    37             dp[pos][0]+=max(dp[to][0],dp[to][1]);
    38         }
    39         else
    40         {
    41             dp[to][0]=dfs(to,0);;
    42             vit[to][0]=vit[pos][1]=1;
    43             dp[pos][1]+=dp[to][0];
    44         }
    45     }
    46     return dp[pos][way];
    47 }
    48 void solve()
    49 {
    50     memset(dp,0,sizeof(dp));
    51     memset(vit,0,sizeof(vit));
    52     dp[ben][0]=dfs(ben,0);
    53     dp[ben][1]=dfs(ben,1);
    54     cout<<max(dp[ben][0],dp[ben][1])<<endl;
    55 }
    56 int main()
    57 {
    58    while(cin>>n)
    59    {
    60        for(int i=1;i<=n;i++)
    61        scanf("%d",&pe[i]);
    62        for(int i=1;i<=n;i++)
    63        ko[i].clear();
    64        int a,b;
    65        memset(fa,-1,sizeof(fa));
    66        while(scanf("%d%d",&a,&b)&&(a+b)!=0){
    67         ko[b].push_back(a);
    68         fa[a]=b;
    69        }
    70         for(int i=1;i<=n;i++)
    71         if(fa[i]==-1)
    72         ben=i;
    73        solve();
    74    }
    75 }
  • 相关阅读:
    编写JS代码的“use strict”严格模式及代码压缩知识
    开发网站要从用户的角度出发!
    你好,世界
    JavaScript的几种函数的结构形式
    JavaScript功能检测技术和函数构造
    android打造万能的适配器
    C语言第二次博客作业分支结构
    C语言第三次博客作业单层循环结构
    C语言第一次博客作业——输入输出格式
    C语言第四次博客作业嵌套循环
  • 原文地址:https://www.cnblogs.com/ainixu1314/p/3854979.html
Copyright © 2020-2023  润新知