zoukankan      html  css  js  c++  java
  • [luogu]P1352 没有上司的舞会[树形DP]

      本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来......

    题目描述

    某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

    输入输出格式

    输入格式:

    第一行一个整数N。(1<=N<=6000)

    接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

    接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

    最后一行输入0 0

    输出格式:

    输出最大的快乐指数。

    输入输出样例

    输入样例#1:
    7
    1
    1
    1
    1
    1
    1
    1
    1 3
    2 3
    6 4
    7 4
    4 5
    3 5
    0 0

    输出样例#1:

    5

      这是一道非常入门的题目,其实这些大佬们构成了一棵树,然而大佬们不愿意与其上司一起参加舞会因为会自卑比较任性...
    那么我们很容易想到以i作为根节点的子树的最大收益(容许我这么说把...)然后我们很容易发现在转移的时候会有问题,大佬上司不能和小弟下级一起出现啊!!!怎么办?
    很简单啊,多添一个状态表示其有没有参加不就得了?I
      所以我们得到方程:
    dp[i][1]=Σ dp[j][0]+hp[i] (快乐指数...)
    dp[i][0]=Σ Max(dp[j][0],dp[j][1]) [j为i的儿子节点]
      是不是很水?
      但是Lowbee我的代码还是一塌糊涂...
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    inline int read();
    using namespace std;
    #define maxn 6010
    struct edge{
        int to;
        int next;
    }e[maxn*3];
    int pre[maxn],dp[maxn][2],hp[maxn],fa[maxn];
    int cnt=1,n;
    //特殊嗜好??? 
    namespace lys{
        //不解释了把... 
        int Max(int x,int y){
            return x>y?x:y;
        }
        //邻接表存图
        void add(int x,int y){
            e[cnt].to=x;e[cnt].next=pre[y];pre[y]=cnt++;
            fa[x]=y;
        }
        //dfs dp主体... 
        void dfs(int x){
            int i,v;
            //初始化... 
            dp[x][1]=hp[x];
            for(i=pre[x];~i;i=e[i].next){
                v=e[i].to;
                dfs(v);
                //方程转移 
                dp[x][0]+=Max(dp[v][0],dp[v][1]);
                dp[x][1]+=dp[v][0];
            }
        }
        int ans;
        int main(){
            n=read();
            int i,x,y;
            for(i=1;i<=n;i++) hp[i]=read();
            memset(pre,-1,sizeof pre);
            memset(fa,-1,sizeof fa);
            while(true){
                x=read(); y=read();
                if(x==0&&y==0) break ;
                add(x,y);
            }
            for(i=1;i<=n;i++){
                if(fa[i]==-1){
                    //蒟蒻搜索 
                    dfs(i);
                    printf("%d
    ",Max(dp[i][1],dp[i][0]));
                    return 0;
                }
            }
        }
    }
    int main(){
        lys::main();
        return 0;
    }
    //Lowbee的垃圾快读 
    inline int read(){
        int k=0,f=1;
        char c=getchar();
        while(c<'0'||c>'9'){
            if(c=='-')
                f=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9'){
            k=k*10+c-'0';
            c=getchar();
        }
        return k*f;
    }
    
    
    


  • 相关阅读:
    成都Uber优步司机奖励政策(2月18日)
    北京Uber优步司机奖励政策(2月18日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月18日)
    优步UBER司机全国各地最新奖励政策汇总(持续更新...)
    新年Uber司机端换新装啦!
    百度参投 Uber中国12亿美元融资已到账
    人民优步+(拼车)自动接单功能上线
    vi 调到第一行,或最后一行
    linux文本操作界面 vi面板如何复制一行
    Apache支持多端口配置处理
  • 原文地址:https://www.cnblogs.com/_inx/p/7222646.html
Copyright © 2011-2022 走看看