羅区には党のボスを-P1352ありません

基本的な考え方

ツリーDPエントリー質問、0が選択されていないチェック1を意味しません。
\ [\開始{アレイ} { L} treedp [U] [0] = MAX(treedp [u.boss] [0]、[u.boss] [1] treedp)\\ treedp [U]を[1] = treedp [u.boss] [0] + ARR [U]; \端{アレイ} \]

#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