洛谷-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;
}