21天好习惯第一期-2 DFS

思路:
感觉和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序是可能有很多种的。
题号 NC13611
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值