题目:P1122 最大子树和
DP - 树形DP - dfs
这题的做法被题目名字给暴露了
设 为以点 为根的子树中的最大子树和
设 为 的子节点,则转移方程为:
后来发现错了,因为 求出来的时候不一定包括了节点 ,也就是说点 可能已经被剪掉了
下面是正解:
设 为以点 为根的最大子树和
转移方程:
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int Maxn=16000+20,inf=0x3f3f3f3f;
int a[Maxn],f[Maxn];
int n,ans;
vector <int> e[Maxn];
void dfs(int x,int fa)
{
int tot=a[x];
for(int i=0;i<e[x].size();++i)
{
int y=e[x][i];
if(y==fa)continue;
dfs(y,x);
if(f[y]>0)tot+=f[y];
}
f[x]=tot;
ans=max(ans,tot);
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=1;i<n;++i)
{
int x,y;
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
printf("%d\n",ans);
return 0;
}