zoukankan      html  css  js  c++  java
  • 洛谷 P1352 没有上司的舞会(树形DP)

    题目链接:https://www.luogu.com.cn/problem/P1352

    设dp[i][0/1],dp[i][0]表示不选第i个职工的最大值,dp[i][1]表示选第i个职工的最大值。

    转移:

    如果不选第i个职工,那么他的下属可选可不选,即dp[i][0]+=max(dp[j][0],dp[j][1])

    如果选第i个职工,那么他的下属一定不能选,即dp[i][1]+=dp[j][0]

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 const int N=6006;
     6 int head[N],vis[N],dp[N][2],r[N];
     7 int n,tot;
     8 struct node{
     9     int to,next;
    10 }edge[N];
    11 void add(int u,int v){
    12     edge[tot].to=v;
    13     edge[tot].next=head[u];
    14     head[u]=tot++;
    15 }
    16 void DFS(int rt){
    17     dp[rt][1]=r[rt];
    18     for(int i=head[rt];i!=-1;i=edge[i].next){
    19         int v=edge[i].to;
    20         DFS(v);
    21         dp[rt][0]+=max(dp[v][0],dp[v][1]);
    22         dp[rt][1]+=dp[v][0];
    23     }
    24 }
    25 int main(){
    26     memset(head,-1,sizeof(head));
    27     scanf("%d",&n);
    28     for(int i=1;i<=n;i++) scanf("%d",&r[i]);
    29     for(int i=1;i<n;i++){
    30         int u,v;
    31         scanf("%d%d",&u,&v);
    32         add(v,u);
    33         vis[u]=1;
    34     }
    35     for(int i=1;i<=n;i++)
    36         if(!vis[i]) { DFS(i); printf("%d",max(dp[i][0],dp[i][1])); return 0;}
    37     return 0;
    38 }
    AC代码
  • 相关阅读:
    区间树
    最大流
    单源最短路径
    散列表
    最小生成树
    软件体系结构2
    软件体系结构
    Leetcode 687.最长同值路径
    Leetcode 686.重复叠加字符串匹配
    Python测试框架
  • 原文地址:https://www.cnblogs.com/New-ljx/p/13599176.html
Copyright © 2011-2022 走看看