• hdu 1520


    树形dp的基础题;

    状态转移很简单:老爸没选,儿子可选可不选,最大就行;

    老爸选了,儿子肯定不能选;

    dp[root][0]+=max(dp[son][1],dp[son][0]);
    dp[root][1]+=dp[son][0];

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 #define maxn 6003
     5 using namespace std;
     6 
     7 int w[maxn],dp[maxn][2];
     8 vector<int>ve[maxn];
     9 bool vis[maxn];
    10 
    11 void dfs(int a)
    12 {
    13     vis[a]=1;
    14     dp[a][1]=w[a];
    15     dp[a][0]=0;
    16     int l=ve[a].size();
    17     for(int i=0; i<l; i++)
    18     {
    19         int v=ve[a][i];
    20         if(vis[v]) continue;
    21         dfs(v);
    22         dp[a][0]+=max(dp[v][1],dp[v][0]);
    23         dp[a][1]+=dp[v][0];
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     int n,a,b;
    30     while(scanf("%d",&n)!=EOF)
    31     {
    32         memset(vis,0,sizeof vis);
    33         memset(dp,0,sizeof dp);
    34         for(int i=1; i<=n; i++)
    35         {
    36             scanf("%d",&w[i]);
    37             ve[i].clear();
    38         }
    39         while(scanf("%d%d",&a,&b)&&(a+b))
    40         {
    41             ve[a].push_back(b);
    42             ve[b].push_back(a);
    43         }
    44         dfs(1);
    45         printf("%d
    ",max(dp[1][0],dp[1][1]));
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    一个很吊的swing循环生成窗口。
    hbase操作的问题
    hadoop+hbase
    linux故障救援
    管道命令xargs
    hadoop浅尝 hadoop与hbase交互
    linux源代码阅读笔记 free_page_tables()分析
    词法分析器flex的使用
    每天一个Linux命令(1): find
    梯度下降
  • 原文地址:https://www.cnblogs.com/yours1103/p/3325593.html
Copyright © 2020-2023  润新知