牛客 树(dfs序)

这题的思路很精妙,因为我们发现每个点有两种选择,一种是涂新的颜色,一种是涂原来出现的颜色

如果按树形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;
}
View Code

 

posted @ 2020-05-10 15:41  朝暮不思  阅读(120)  评论(0编辑  收藏  举报