这题的思路很精妙,因为我们发现每个点有两种选择,一种是涂新的颜色,一种是涂原来出现的颜色
如果按树形dp的方法做,很难做,因为无法判断点之间的路径以及存在的颜色关系。因此想到使用dfs序的方式,转化成链式
这样该节点涂色之前父亲节点也被涂色。而新颜色可以随便选,原来的颜色必须和父亲节点的颜色一样
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+10; const int mod=1e9+7; ll f[330][330]; int main(){ int i; int n,k; cin>>n>>k; for(i=1;i<n;i++){ int x,y; cin>>x>>y; } f[0][0]=1; for(i=1;i<=n;i++){ for(int j=1;j<=k;j++){ f[i][j]=(f[i-1][j]+f[i-1][j-1]*(k-j+1))%mod; } } ll ans=0; for(i=1;i<=k;i++){ ans=(ans+f[n][i])%mod; } cout<<ans<<endl; return 0; }