每日一题 树

题意:
给树上联通块染色,染色颜色不超过k的方案数.
思路:
按照dfs序便利,用dp[i][j]代表考虑前i个的dfs序列涂j种颜色的方案数,初始状态,dp[1][1]=k,转移呢,dp[i][j]=dp[i-1][j-1]+(k-j+1)dp[i-1][j-1].为什么这么转移呢,一种是用新的颜色,另一种是用与他的父节点相同的颜色。

#include<bits/stdc++.h>
using namespace std;
const int N=310;
#define int long long 
const int mod=1e9+7;
int dp[N][N];
int n,k;
int dfn[N];
vector<int>v[N];
int idx;
void dfs(int u,int fa)
{
    dfn[u]=++idx;
    for(auto j:v[u])
    {
        if(j==fa)   continue;

        dfs(j,u);
    }
}
signed main()
{
    cin >> n >> k;
    for(int i=0;i<n-1;i++)
    {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }

    dp[1][1]=k;
    dfs(1,0);
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            dp[i][j]=(dp[i-1][j-1]*(k-j+1)+dp[i][j]+dp[i-1][j])%mod;

        }
    }
    int res=0;
    for(int i=1;i<=n;i++)
        res=(res+dp[n][i])%mod;
    cout<<res<<endl;
    return 0;


}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务