poj 2342 && hdu 1520 树形dp
题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的
链接:点我
dp[i][1] += dp[j][0],
dp[i][0] += max{dp[j][0],dp[j][1]};其中j为i的孩子节点。
第二次做感觉已经很水了
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("*****\n"); 15 const int MAXN=6010; 16 int n,m,tt; 17 int aa[MAXN]; 18 int tot,head[MAXN],dp[MAXN][2],in[MAXN]; 19 struct Edge 20 { 21 int to,next; 22 }edge[MAXN]; 23 void addedge(int u,int v) 24 { 25 edge[tot].to=v; 26 edge[tot].next=head[u]; 27 head[u]=tot++; 28 } 29 int dfs(int u) 30 { 31 for(int i=head[u];i!=-1;i=edge[i].next) 32 { 33 int v=edge[i].to; 34 dfs(v); 35 dp[u][1]+=dp[v][0]; 36 dp[u][0]+=max(dp[v][0],dp[v][1]); 37 } 38 return max(dp[u][0],dp[u][1]); 39 } 40 void init() 41 { 42 tot=0; 43 memset(head,-1,sizeof(head)); 44 cl(dp); 45 cl(in); 46 } 47 int main() 48 { 49 int i,j,k; 50 #ifndef ONLINE_JUDGE 51 freopen("1.in","r",stdin); 52 #endif 53 while(scanf("%d",&n)!=EOF) 54 { 55 init(); 56 for(i=1;i<=n;i++) 57 scanf("%d",&dp[i][1]); 58 int a,b; 59 while(scanf("%d%d",&a,&b)) 60 { 61 if(a==0&&b==0)break; 62 addedge(b,a); 63 in[a]++; 64 } 65 int ans=0; 66 for(i=1;i<=n;i++) //题目的意思就一棵树 67 { 68 if(!in[i]) ans=dfs(i); 69 } 70 printf("%d\n",ans); 71 } 72 }