洛谷-P1352没有上司的舞会

基本思路

树形dp入门题,0表示不选中1表示选中。
\[ \begin{array}{l} treedp[u][0]=max(treedp[u.boss][0],treedp[u.boss][1])\\ treedp[u][1]=treedp[u.boss][0]+arr[u]; \end{array} \]

#include<bits/stdc++.h>
using namespace std;
vector<int>boss[7000];
int arr[7000],brr[7000];
int treedp[7000][2];
int n;
void dfs(int u)
{
    treedp[u][1]=arr[u];
    treedp[u][0]=0;
    //for(int i=1;i<=n;i++)
    {
        for(int v:boss[u])
        {
            dfs(v);
            treedp[u][0]+=max(treedp[v][0],treedp[v][1]);
            treedp[u][1]+=treedp[v][0];
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>arr[i];
        
    }
    
    for(int i=1;i<=n-1;i++)
    {
        int l,r;
        cin>>l>>r;
        boss[r].push_back(l);
        brr[l]=1;
    }
    for(int i=1;i<=n;i++)
    {
        if(brr[i]==0)
        {
            //cout<<i<<endl;
            dfs(i);
            cout<<max(treedp[i][0],treedp[i][1])<<endl;
            break;
        }
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tldr/p/11221024.html