思路:
感觉和dfs序联系不大,画个图后发现涂颜色只有两种方案(引用每日一题的图片):
1.使用用过的颜色,但是一定要和它处理过的父结点或者儿子结点涂一样的颜色,只有这样才能保证一样颜色的点在一个路径上;
2。使用没用过的颜色,已经用了j-1种颜色,所以还剩k-j+1种颜色可以涂
可以用dp来求解:
状态:dp[i][j],处理到第i个点时用了j种颜色。
状态转移方程:dp[i][j]=(dp[i-1][j]+dp[i-1][j-1]*(k-j+1))%mod.
代码:
#include<bits/stdc++.h> #define ll long long #define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; const int mod=1e9+7; ll dp[305][305],ans=0; int n,k; int main() { js; cin>>n>>k; dp[0][0]=1; for(int i=1;i<=n;++i) for(int j=1;j<=k;++j) dp[i][j]=(dp[i-1][j]+dp[i-1][j-1]*(k-j+1))%mod; for(int i=1;i<=k;++i) ans=(ans+dp[n][i])%mod; cout<<ans<<endl; return 0; }
这是dfs序的题解当然少不了,dfs序,引用每日一题的图片和介绍:
稍微注意一点,在一般的树中(二叉树除外)一个节点的儿子是没有左右顺序的可以随便先访问哪个,所以,一棵树的dfs序是可能有很多种的。