您当前处于兼容模式。某些功能在此模式下不可用。我们强烈建议在现代浏览器上切换为标准模式以获得更好的体验。 标准模式 隐藏

简单的树形DP

作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,f[N],g[N],dis[N][2],son[N][2];
vector<int>e[N];
void dfs1(int x,int fa){
	for(auto v:e[x]){
		if(v==fa)continue;
		dfs1(v,x);
		f[x] = max(f[x],1+f[v]);
		if(dis[v][0]+1>=dis[x][0]){
			dis[x][1] = dis[x][0];
			son[x][1] = son[x][0];
			dis[x][0] = dis[v][0]+1;
			son[x][0] = v;
		}
		else if(dis[v][0]+1>dis[x][1]){
			dis[x][1] = dis[v][0]+1;
			son[x][1] = v;
		}
	}
}
void dfs2(int x,int fa){
	if(x!=1){
		g[x] = 1+g[fa];
		if(son[fa][0]==x){
			g[x] = max(g[x],1+dis[fa][1]);
		}
		else{
			g[x] = max(g[x],1+dis[fa][0]);
		}
	}
	for(auto v:e[x]){
		if(v==fa)continue;
		dfs2(v,x);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs1(1,0);
	dfs2(1,0);
	for(int i=1;i<=n;i++){
		cout<<max(f[i],g[i])<<" ";
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
#define int long long
int n,f[N],siz[N],dis[N];
vector<int>e[N];
void dfs1(int x,int fa){
	siz[x] = 1;
	if(x!=1)
		dis[x] = dis[fa]+1;
	for(auto v:e[x]){
		if(v==fa)continue;
		dfs1(v,x);
		siz[x]+=siz[v];
	}
}
void dfs2(int x,int fa){
	for(auto v:e[x]){
		if(v==fa)continue;
		f[v] = f[x]-siz[v]+n-siz[v];
		dfs2(v,x);
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs1(1,0);
	for(int i=1;i<=n;i++){
		f[1]+=dis[i];
	}
	dfs2(1,0);
	for(int i=1;i<=n;i++){
		cout<<f[i]<<" ";
	}
	return 0;
}
/*
f[i][j]距离i点为j的点有多少个
f[x][j] += f[v][j-1]

f[x][k] += f[v][m-k-1]
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e4+5;
int n,k,f[N][505],res;
vector<int>e[N];
void dfs(int x,int fa){
	f[x][0] = 1;
	for(auto v:e[x]){
		if(v==fa)continue;
		dfs(v,x);
		for(int i=0;i<=k;i++){
			if(k-i-1>=0)
				res += f[x][i]*f[v][k-i-1];
		}
		for(int i=1;i<=k;i++){
			f[x][i]+=f[v][i-1];
		}
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+5,Mod=1e9+7;
int T,n,m,a[N],siz[N],b[N];
vector<int>e[N];
void dfs(int x,int fa){
	siz[x] = 1;
	for(auto v:e[x]){
		if(v==fa)continue;
		dfs(v,x);
		siz[x]+=siz[v];
		a[v] = (siz[v]*(n-siz[v]));
	}
}
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++)e[i].clear();
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(int i=1;i<n;i++){
			int x,y;
			cin>>x>>y;
			e[x].push_back(y);
			e[y].push_back(x);
		}
		dfs(1,0);
		cin>>m;
		for(int i=2;i<=m+1;i++){
			cin>>b[i];
		}
		sort(a+2,a+n+1);
		if(m+1<=n){
			for(int i=m+2;i<=n;i++){
				b[i] = 1;
			}
			sort(b+2,b+n+1);
			int res = 0;
			for(int i=2;i<=n;i++){
				res+=a[i]*b[i]%Mod;
				res%=Mod;
			}
			cout<<res<<endl;	
		}
		else{
			sort(b+2,b+m+2);
			int res = 0;
			for(int i=n+1;i<=m+1;i++){
				b[n]*=b[i];b[n]%=Mod;
			}
			for(int i=2;i<=n;i++){
				res+=a[i]*b[i]%Mod;
				res%=Mod;
			}
			cout<<res<<endl;
		}
	}
	return 0;
}
状态
已结束
题目
6
开始时间
2026-3-21 0:00
截止时间
2026-3-29 23:59
可延期
24 小时