1 条题解
-
0
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
- 上传者