树形DP hdu1520
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 struct node 7 { 8 int fro,to,next; 9 }e[36000000]; 10 int dp[6000][2]; 11 int num=0; 12 int head[6000]; 13 int val[6000]; 14 bool isye[6000]; 15 16 void addEdge(int _fro,int _to) 17 { 18 num++; 19 e[num].fro=_fro; 20 e[num].to=_to; 21 e[num].next=head[_fro]; 22 head[_fro]=num; 23 } 24 25 int dfs(int x) 26 { 27 dp[x][0]=0; 28 dp[x][1]=val[x]; 29 for(int i=head[x];i!=-1;i=e[i].next) 30 { 31 int v=e[i].to; 32 dfs(v); 33 dp[x][0]+=max(dp[v][0],dp[v][1]); 34 dp[x][1]+=dp[v][0]; 35 } 36 return max(dp[x][0],dp[x][1]); 37 } 38 39 int main() 40 { 41 int n; 42 while(scanf("%d",&n)!=EOF) 43 { 44 for(int i=1;i<=n;i++) 45 { 46 scanf("%d",&val[i]); 47 } 48 int a,b; 49 for(int i=0;i<=n;i++) 50 { 51 head[i]=-1; 52 isye[i]=true; 53 } 54 while(scanf("%d%d",&a,&b)!=EOF) 55 { 56 if(a==0&&b==0) 57 break; 58 addEdge(b,a); 59 isye[a]=false; 60 } 61 for(int i=1;i<=n;i++) 62 { 63 if(isye[i]) 64 { 65 cout<<dfs(i)<<endl; 66 } 67 } 68 } 69 return 0; 70 }