AT_arc171_c [ARC171C] Swap on Tree题解
[ARC171C] Swap on Tree
安利一下我的博客!
这题真的有这么复杂吗?感觉我的做法很简单啊。
思路
设
考虑类似于树形背包,在
若
若
代码
时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,dp[3005][3005],si[3005];
vector<int> a[3005];
void dfs(int x,int fa)
{
si[x]=1,dp[x][1]=1;
for(int i=0;i<a[x].size();i++)
if(a[x][i]!=fa)
{
dfs(a[x][i],x);
for(int j=si[x];j>=1;j--)
{
int res=0;
for(int k=1;k<=si[a[x][i]];k++)
{
dp[x][j+1]=(dp[x][j+1]+1ll*dp[x][j]*dp[a[x][i]][k]%mod*j*k)%mod;
res=(res+1ll*dp[x][j]*dp[a[x][i]][k]%mod)%mod;
}
dp[x][j]=res;
}
si[x]+=si[a[x][i]];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
a[u].push_back(v),a[v].push_back(u);
}
dfs(1,0);
int ans=0;
for(int i=1;i<=n;i++) ans=(ans+dp[1][i])%mod;
cout<<ans;
return 0;
}