RocksonLee's Blog
avatar
RocksonLee
2021-11-01 21:39:48
  • 本文总阅读量
查看原题

点击跳转

这道题树形dp不是很难,但是提醒了个点,注意存图的时候,是从1开始还是0开始。。。。

两种情况

要他来,那么他的下属就不能来,如果他不来,他的下属可以来或者不来。。

这样就是两道方程,直接递推就好了

#include <bits/stdc++.h>
#define INF 0x3F3F3F3F
#define N 6000+100
using namespace std;
vector<int> a[N];
int n,r[N],f[N][2],root,v[N],templ,tempk;
void dp(int x)
{
    f[x][0]=0;
    f[x][1]=r[x];
    for (int i = 0; i < a[x].size(); i++)
    {
        int y=a[x][i];
        dp(y);
        f[x][0]+=max(f[y][0],f[y][1]);
        f[x][1]+=f[y][0];
    }
}
int main()
{
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
        scanf("%d",&r[i]);
    for (int i = 1; i <=n-1; i++)
    {
        scanf("%d%d",&templ,&tempk);
        a[tempk].push_back(templ);
        v[templ]++;
    }
    for (int i = 1; i <= n; i++)
        if(!v[i]) {root=i;break;}
    dp(root);
    cout<<max(f[root][1],f[root][0])<<endl;
}
LG P1352 没有上司的舞会
comment评论
Search
search