传送门
解题思路
就是一道树形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 }