树形dp——没有上司的舞会
2016-07-02 18:27
246 查看
#include<cstdio> #include<cstring> #include<iostream> #define minn -99999999 using namespace std; struct hh{ int num; int a[6011]; }; int n, wi[6011], dp[2][6011]; hh s[6011]; int f(int a, int b) { if(dp[a][b]) return dp[a][b]; if(a==1) dp[a][b]+=wi[b]; int& t=dp[a][b]; for(int i=1;i<=s[b].num;i++) { if(a==1) t+=f(0, s[b].a[i]); else t+=max(f(1,s[b].a[i]),f(0,s[b].a[i])); } return t; } int main() { scanf("%d", &n); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { scanf("%d", &wi[i]); s[i].num=0; } while(true) { int a, b; scanf("%d %d", &a, &b); if(a==0) break; int& t=s[b].num; t++; s[b].a[t]=a; } for(int i=1;i<=n;i++) { dp[0][i]=f(0,i); dp[1][i]=f(1,i); } int maxn=minn; for(int i=1;i<=n;i++) for(int j=0;j<2;j++) maxn=max(dp[j][i],maxn); printf("%d\n", maxn); return 0; }