标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9066 Accepted Submission(s):
3896
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <queue> 5 #include <stack> 6 #include <vector> 7 #include <iostream> 8 #include "algorithm" 9 using namespace std; 10 typedef long long LL; 11 const int MAX=6005; 12 int n,root; 13 int a[MAX]; 14 int tot; 15 int head[MAX],adj[MAX],next[MAX]; 16 int f[MAX][2]; 17 void addedge(int u,int v){ 18 tot++; 19 adj[tot]=v; 20 next[tot]=head[u]; 21 head[u]=tot; 22 } 23 void init(){ 24 int i,j; 25 int u,v; 26 int t[MAX]; 27 memset(t,0,sizeof(t)); 28 scanf("%d",&n); 29 for (i=1;i<=n;i++) 30 scanf("%d",a+i); 31 for (i=1;i<n;i++) 32 {scanf("%d%d",&v,&u); 33 addedge(u,v); 34 t[v]++; 35 } 36 for (i=1;i<=n;i++) 37 if (t[i]==0) 38 {root=i; 39 break; 40 } 41 memset(f,-1,sizeof(f)); 42 } 43 int dfs(int x,int k){ 44 int i,j; 45 if (f[x][k]!=-1) 46 return f[x][k]; 47 if (k==1) 48 {int y=0; 49 for (i=head[x];i;i=next[i]) 50 y+=dfs(adj[i],0); 51 f[x][k]=a[x]+y; 52 } 53 else 54 {int y=0; 55 for (i=head[x];i;i=next[i]) 56 y+=max(dfs(adj[i],0),dfs(adj[i],1)); 57 f[x][k]=y; 58 } 59 return f[x][k]; 60 } 61 int main(){ 62 freopen ("party.in","r",stdin); 63 freopen ("party.out","w",stdout); 64 init(); 65 printf("%d",max(dfs(root,0),dfs(root,1))); 66 return 0; 67 }
HDU-1520 Anniversary party(树形DP)
标签:
原文地址:http://www.cnblogs.com/Michaelzzn/p/5743423.html