f[i][0]表示i的子树,不选i的最大值,f[i][1]表示i的子树,选i的最大值
树形dp基础
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=6010;
int n,h[maxn],out[maxn],f[maxn][2];
vector <int> G[maxn];
void dp(int x)
{
f[x][0]=0;
f[x][1]=h[x];
for(int i=0;i<G[x].size();i++)
{
int to=G[x][i];
dp(to);
f[x][0]+=max(f[to][0],f[to][1]);
f[x][1]+=f[to][0];
}
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
G[y].push_back(x);
out[x]=1;
}
int root;
for(int i=1;i<=n;i++)
if(!out[i])
{
root=i;
break;
}
dp(root);
printf("%d\n",max(f[root][0],f[root][1]));
return 0;
}

本文深入解析树形动态规划的基础概念与实现细节,通过具体代码示例展示如何利用树形DP解决最大值问题,包括状态定义、状态转移方程及递归调用流程。

被折叠的 条评论
为什么被折叠?



