1 条题解

  • 0
    @ 2025-2-14 21:20:42

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    int n;
    bool b[6001];
    int a[6001];
    int ne;//总结点 
    int f[6001][2];//寻根 
    int hd[6001];
    struct jiegouti{
    	int v;
    	int next;
    };
    struct jiegouti e[6001];
    void so(int v,int u)
    {
    	ne++;
    	e[ne].v=v;
    	e[ne].next=hd[u];
    	hd[u]=ne;
    }
    void dp(int u)
    {
    	f[u][1]=a[u];//1是要,0是不要 
    	f[u][0]=0;
    	for(int i=hd[u];i!=0;i=e[i].next)
    	{
    		int v=e[i].v;
    		dp(v);
    		f[u][1]+=f[v][0];
    		f[u][0]=f[u][0]+max(f[v][1],f[v][0]);
    	} 
    	
    }
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	cin>>a[i];
    	int l,k;
    	while(cin>>l>>k&&l!=0&&k!=0)
    	{
    		b[l]=1;
    		so(l,k);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(b[i]==0)
    		{
    			dp(i);
    			cout<<max(f[i][0],f[i][1]);
    			break;
    		}
    	}
    	return 0;
    }
    
    

    Pascal :

    program dinner;
    type link=^node;
         node=record
              s:longint;
              next:link;
         end;
    var r:array[1..6000]of longint;
        sum:array[1..6000,0..1]of longint;
        son:array[1..6000]of link;
        n,root:longint;
    function maxnum(a,b:longint):longint;
    begin
      if a>b then maxnum:=a
      else maxnum:=b;
    end;{maxnum}
    procedure init;
    var a,b,i:longint;
        p:link;
    begin
      readln(n);
      for i:=1 to n do
        begin
          readln(r[i]);
        end;{for-i}
      readln(a,b);
      while (a<>0)and(b<>0) do
        begin
          inc(root,a);
          new(p);
          p^.s:=a;
          p^.next:=son[b];
          son[b]:=p;
          readln(a,b);
        end;{while}
      root:=(n*(n+1)div 2)-root;
    end;{init}
    procedure calc(k:longint);
    var p:link;
        i:longint;
    begin
      sum[k,0]:=0;
      sum[k,1]:=0;
      p:=son[k];
      while p<>nil do
        begin
          i:=p^.s;
          calc(i);
          inc(sum[k,0],maxnum(sum[i,0],sum[i,1]));
          inc(sum[k,1],sum[i,0]);
          p:=p^.next;
        end;{while}
      inc(sum[k,1],r[k]);
    end;{calc}
    procedure output;
    begin
      writeln(maxnum(sum[root,0],sum[root,1]));
    end;{out}
    begin{main}
      init;
      calc(root);
      output;
    end.
    
    • 1

    信息

    ID
    842
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者