• 树形DP:没有上司的舞会


    题目描述 Description

          Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。

    输入描述 Input Description

    第一行一个整数N。(1<=N<=6000)
    接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
    接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
    最后一行输入0,0。

    输出描述 Output Description

    输出最大的快乐指数。

    样例输入 Sample Input

    7
    1
    1
    1
    1
    1
    1
    1
    1 3
    2 3
    6 4
    7 4
    4 5
    3 5
    0 0

    样例输出 Sample Output

    5

    第一回做树形DP,感觉幸亏提前学了并查集。

    uses math;//由于用到了最大值判断,不想打子函数了
    var father:array[1..6000]of integer;//并查集中父节点的值
    i,j,k,l:longint;
    happy:array[1..6000]of integer;//每个人的快乐值
    n,m,x,y:longint;
    grandfather:longint;、、祖先节点
    f:array[1..6000,0..1]of longint;//0表示不选这个人所获得的最大快乐值,1表示选这个人所获得的最大快乐值
    function find(x:longint):longint;//并查集寻找祖先
    begin if father[x]=x then exit(x);
    exit(find(father[x]));
    end;
    procedure dfs(x:longint);
    var i,j,k:longint;
    begin f[x,1]:=happy[x];
    for i:=1 to n do
    if (father[i]=x)and(i<>x)
    then begin f[i,1]:=happy[i];
    dfs(i);
    f[x,0]:=max(f[x,0],f[x,0]+max(f[i,1],f[i,0]));
    f[x,1]:=max(f[x,1],f[x,1]+f[i,0]);
    end;
    end;

    begin readln(n);
    fillchar(father,sizeof(father),0);
    fillchar(happy,sizeof(happy),0);
    fillchar(f,sizeof(f),0);
          for i:=1 to n do
    begin father[i]:=i;
    readln(happy[i]);
    end;
    readln(x,y);//读入建树
    while (x<>0)and(y<>0) do
    begin father[x]:=y;
    readln(x,y);
    end;
    grandfather:=find(1);
    dfs(grandfather);
    writeln(max(f[grandfather,1],f[grandfather,0]));
    end.
  • 相关阅读:
    jsp第四次
    jsp第二次作业
    jsp第一次作业
    软件测试课堂练习
    11.11日
    10.28
    10.25
    10.21
    jsp第七周作业
    JSP第六周作业
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4230520.html
Copyright © 2020-2023  润新知