树形dp问题
查看原帖
树形dp问题
372172
Q__A__Q楼主2023/10/10 21:43

输出均为0

感觉是初始化或叶子节点处理的问题

代码:

#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize("Ofast")
typedef long long ll;
typedef pair<int,int> pii;
#define mk(a,b) make_pair((a),(b))
#define int ll

const int maxn=1010;
const int inf=1e12;
const int mod=1e9+7;
int n,m,k,ans;
int f[maxn][5];

inline int read() {
	int s=0,w=1;
	char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(isdigit(ch)) s=s*10+ch-'0',ch=getchar();
	return s*w;
}

inline void write(int x) {
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10);
	putchar('0'+x%10);
}

vector<int> g[maxn];

inline void dfs(int u,int fa) {
	int mx1=0,mx2=0;
	if(g[u].size()==0) {
		f[u][1]=f[u][2]=1;
	}
	for(auto v:g[u]) {
		if(v==fa) continue;
		dfs(v,u);
		f[u][0]+=f[v][4];
		f[u][1]+=f[v][3];
		mx1=max(mx1,f[v][3]-f[v][0]);
		f[u][2]+=f[v][2];
		mx2=max(mx2,f[v][2]-f[v][1]);
		f[u][3]+=f[v][2];
		f[u][4]+=f[v][3];
	}
	f[u][0]++;
	f[u][1]-=mx1;
	f[u][2]-=mx2;
	f[u][1]=min(f[u][0],f[u][1]);
	f[u][2]=min(f[u][1],f[u][2]);
	f[u][3]=min(f[u][2],f[u][3]);
	f[u][4]=min(f[u][3],f[u][4]);
}

signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n=read();
	for(int i=2;i<=n;++i) {
		int v=read();
		g[v].push_back(i);
		g[i].push_back(v);
	}
	dfs(1,0);
//	for(int i=1;i<=n;++i)
//		cout<<f[i][2]<<endl;
	write(f[1][2]),puts("");
	return 0;
}

2023/10/10 21:43
加载中...