树形DP爆零求助
查看原帖
树形DP爆零求助
340632
Cry_For_theMoon楼主2020/8/15 12:17

rt

  我的做法和题解一样,代码也差不多,但不知道为什么玄学WA0分,求助各位大佬QwQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010,maxm=2020,INF=2e9;
struct Edge{
	int u,v;
}edge[maxm];
int first[maxn],next[maxm],tot,vis[maxn],get[maxn];
int n,f[maxn][6]; //-2,-1,0,1,2 
void addedge(int u,int v){
	tot++;
	edge[tot].u=u;edge[tot].v=v;
	next[tot]=first[u];
	first[u]=tot;
}
void dfs(int u){
	vis[u]=1;
	int flag=0; 
	for(int j=first[u];j;j=next[j]){
		int v=edge[j].v;
		if(vis[v])continue;
		flag=1;
		dfs(v);
	}
	get[u]=1;
	if(!flag){
		//叶子 
		f[u][1]=f[u][2]=f[u][3]=1;
		f[u][4]=f[u][5]=INF;
		return;
	}
	f[u][1]=1;
	f[u][2]=f[u][3]=1e9;
	f[u][4]=f[u][5]=0;
	int sum3=0,sum4=0;
	for(int j=first[u];j;j=next[j]){
		int v=edge[j].v;
		if(!get[v])continue;
		sum3+=f[v][3];
		sum4+=f[v][4];
	}
	for(int j=first[u];j;j=next[j]){
		int v=edge[j].v;
		if(!get[v])continue;
		f[u][1]+=f[v][5];
		f[u][2]=min(f[u][2],f[v][1]+sum4-f[v][4]);
		f[u][3]=min(f[u][3],f[v][2]+sum3-f[v][3]);
		f[u][4]+=f[v][3];
		f[u][5]+=f[v][4];
	}
	for(int i=2;i<=5;i++){
		f[u][i]=min(f[u][i],f[u][i-1]);
	}
}
int main(){
	cin>>n;
	for(int i=2;i<=n;i++){
		int a;
		cin>>a;
		//i-a
		addedge(i,a);
		addedge(a,i); 
	}
	dfs(1);
	cout<<f[1][3];
	return 0;
}
2020/8/15 12:17
加载中...