题目:
poj
tyvj -> -> 这个是中文的哦!! 看这个吧 但是数据范围是一半 所以交还是要去是poj 的
题意:
略
分析:
这是朕的第一道树形dp 。
如上,我们可以把他们的关系 建成一个 树形图
然后进行树形dp 树形dp的方程 没 啥。
看代码吧:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
//by mars_ch
int dp[6001][2];
int vis[6001];
int fa[6001];
int n;
void tree_dp(int a)
{
vis[a]=1;
for(int i=1;i<=n;i++)
{
if(vis[i] == 0 && fa[i] == a)
{
tree_dp(i);
//key point
dp[a][1]+=dp[i][0];
dp[a][0]+=max(dp[i][0],dp[i][1]);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&dp[i][1]);
}
int root=0;
bool ii=1; //记录父节点
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x == 0 && y== 0)
break;
fa[x]=y;
if(root == x || ii == 1)
{
root=y;
}
}
tree_dp(root);
int ans=max(dp[root][0],dp[root][1]);
printf("%d\n",ans);
return 0;
}