树形dp
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=6010; 6 int f[N][2],w[N],in[N],out[N],n; 7 int head[N],nxt[N],son[N],size; 8 void uni(int x,int y){ 9 size++; 10 nxt[size]=head[x]; 11 head[x]=size; 12 son[size]=y; 13 in[x]++; 14 out[y]++; 15 } 16 int dp(int x,int k){ 17 int &ans=f[x][k]; 18 if (ans) 19 return ans; 20 if (!in[x]){ 21 if (!k) 22 return ans=0; 23 else 24 return ans=w[x]; 25 } 26 if (k) 27 ans=w[x]; 28 else 29 ans=0; 30 if (k) 31 for (int e=head[x];e;e=nxt[e]){ 32 int y=son[e]; 33 ans+=dp(y,1-k); 34 } 35 else 36 for (int e=head[x];e;e=nxt[e]){ 37 int y=son[e]; 38 int r1=dp(y,1-k); 39 int r2=dp(y,k); 40 ans+=max(r1,r2); 41 } 42 return ans; 43 } 44 int main(){ 45 int k,l; 46 memset(f,0,sizeof(f)); 47 size=0; 48 scanf("%d",&n); 49 for (int i=1;i<=n;i++) 50 scanf("%d",&w[i]); 51 for (int i=1;i<=n;i++){ 52 scanf("%d %d",&l,&k); 53 if (l&&k) 54 uni(k,l); 55 } 56 for (int i=1;i<=n;i++) 57 if (!out[i]) 58 uni(0,i); 59 printf("%d",dp(0,0)); 60 return 0; 61 }
浙公网安备 33010602011771号