首页 > 其他 > 详细

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

时间:2020-01-17 23:40:18      阅读:58      评论:0      收藏:0      [点我收藏+]

传送门


解题思路

就是一道树形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 }

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

原文:https://www.cnblogs.com/yinyuqin/p/12207465.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!