洛谷 P1352 没有上司的舞会(树形dp)

传送门


解题思路

就是一道树形dp的模板。

偷得课件QAQ:

这个题用dp[i][0]表示i不去时以i为根的子树的最大快乐指数,

    dp[i][1]表示i去时以i为根的子树的最大快乐指数。

然后转移方程就很容易写出来了。见代码。

最后要注意输入的u,v是v是u的上司。

AC代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int n,r[6005],cnt,dp[6005][2],p[6005],root;
 6 bool vis[6005];
 7 struct node{
 8     int v,next;
 9 }e[6005];
10 void insert(int u,int v){
11     cnt++;
12     e[cnt].v=v;
13     e[cnt].next=p[u];
14     p[u]=cnt; 
15 }
16 void dfs(int u){
17     for(int i=p[u];i!=-1;i=e[i].next){
18         int v=e[i].v;
19         dfs(v);
20         dp[u][0]+=max(dp[v][0],dp[v][1]);
21         dp[u][1]+=dp[v][0];
22     }
23 }
24 int main(){
25     memset(p,-1,sizeof(p)); 
26     cin>>n;
27     for(int i=1;i<=n;i++){
28         cin>>dp[i][1];
29     }
30     for(int i=1;i<n;i++){
31         int u,v;
32         cin>>u>>v;
33         vis[u]=1;
34         insert(v,u);
35     }
36     for(int i=1;i<=n;i++){
37         if(!vis[i]){
38             root=i;
39             break;
40         }
41     }
42     dfs(root);
43     cout<<max(dp[root][0],dp[root][1]);
44     return 0;
45 }

猜你喜欢

转载自www.cnblogs.com/yinyuqin/p/12207465.html