链接:https://ac.nowcoder.com/acm/problem/20811
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

“你,你认错人了。我真的,真的不是食人魔。”--蓝魔法师

给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一条边在一个方案中被删除,而在另一个方案中未被删除,答案对998244353取模

输入描述:

第一行两个整数n,k, 表示点数和限制
2 <= n <= 2000, 1 <= k <= 2000
接下来n-1行,每行包括两个整数u,v,表示u,v两点之间有一条无向边
保证初始图联通且合法

输出描述:

共一行,一个整数表示方案数对998244353取模的结果

示例1

输入

复制

5 2
1 2
1 3
2 4
2 5

输出

复制

7

不会树形dp,思路参考于https://blog.csdn.net/xianpingping/article/details/83447668

用dp【u】【p】表示根节点为u的连通块(包括u),它的连通块大小为p时的方案数

其中dp【u】【0】表示所有方案之和

这样就是一个计数问题,而计数问题最怕遗漏和重复,状态该如何转移呢?

对于它的一个子节点v,当u访问到v时,假设之前已经访问了几个子节点,之前访问的节点个数为siz[u],那么假设我们要让连通块大小为p,p可以从两个地方来:从之前访问过的节点中,也就是siz【u】,也可以从现在正在访问的节点v,也就是siz【v】。那么根据乘法计数原理,答案就是两者相乘。

搜索代码如下:

 for(int i=0;i<G[u].size();i++){int v=G[u][i];dfs(v);ll temp[maxn];memset(temp,0,sizeof(temp));for(int ii=1;ii<=siz[u];ii++){for(int j=0;j<=min(k-ii,siz[v]);j++){//当前连通块大小为ii+j,其中ii来自之前访问过的子节点,j来自现在正在访问的子节点,计数原理为乘temp[ii+j]=(temp[ii+j]%mod+dp[u][ii]*dp[v][j]%mod)%mod;}}for(int j=1;j<=k;j++){dp[u][j]=temp[j];}siz[u]+=siz[v];}

所以整个代码也就很好写了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=2000+10;
vector<int>G[maxn];
ll dp[maxn][maxn];
ll n,k;
ll siz[maxn];//每个节点的子节点个数
void dfs(int u){siz[u]=1;dp[u][1]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i];dfs(v);ll temp[maxn];memset(temp,0,sizeof(temp));for(int ii=1;ii<=siz[u];ii++){for(int j=0;j<=min(k-ii,siz[v]);j++){//当前连通块大小为ii+j,其中ii来自之前访问过的子节点,j来自现在正在访问的子节点,计数原理为乘temp[ii+j]=(temp[ii+j]%mod+dp[u][ii]*dp[v][j]%mod)%mod;}}for(int j=1;j<=k;j++){dp[u][j]=temp[j];}siz[u]+=siz[v];}for(int i=1;i<=k;i++){dp[u][0]+=dp[u][i];dp[u][0]%=mod;}
}int main(){while(scanf("%lld%lld",&n,&k)!=EOF){for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);}memset(dp,0,sizeof(dp));dfs(1);printf("%lld\n",dp[1][0]);}return 0;
}

蓝魔法师——树形DP相关推荐

  1. Wannafly挑战赛27 C 蓝魔法师(树上dp)

    链接:https://ac.nowcoder.com/acm/contest/215/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. Wannafly挑战赛27: C. 蓝魔法师(树形DP)

    链接:https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一 ...

  3. 蓝魔法师(树形dp)

    链接:https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  4. 刷题记录:牛客NC20811蓝魔法师

    传送门:牛客 题目描述: "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不 同当且仅当存在 ...

  5. 牛客网 【每日一题】8月5日题目精讲—蓝魔法师

    来源:牛客网: 文章目录 题目描述 题解: 代码: 题目描述 "你,你认错人了.我真的,真的不是食人魔."–蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于 ...

  6. 牛客网 Wannafly挑战赛27 蓝魔法师

    蓝魔法师 链接: https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔 ...

  7. 牛客wannafly27 C 树形dp

    Description "你,你认错人了.我真的,真的不是食人魔."–蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一条边 ...

  8. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  9. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

最新文章

  1. 234. Palindrome Linked List - Easy
  2. git回退历史记录总结
  3. 《区块链100问》笔记整理——23~41问
  4. eclipse python_【Python基础】Python基础语法
  5. 【Python】一种超简单的变量交换方法
  6. java ftp 读取 txt文件_java通过ftp方式读取文件,并解析入库
  7. html php打开,html格式如何打开
  8. 如何将mysql文件导入MySQL_如何将mysql5的sql文件导入到mysql4?
  9. 手动抛出异常_Java异常处理最佳实践及陷阱防范
  10. 你可能不太熟知的布局技巧
  11. java中if的嵌套循环_嵌套的多个“Next变量”if then循环
  12. LTE学习:传输块大小的计算
  13. 阿里历年经典Java面试题汇总
  14. Cisco ASA防火墙基础--转载http://wenzhongxiang.blog.51cto.com/6370734/1249746
  15. 【青梅快讯】迅速迭代,Greenplum6为你带来持续惊喜
  16. 关于最近阿里内部员工抢月饼事件引发的js程序扩展
  17. MySQL多个筛选条件_mysql一对多关联查询的时候筛选条件
  18. 设置deepin国内源
  19. Shopify独立站注册建站教程,Shopify独立站怎么做
  20. 飞桨PP-HumanSeg本地实时视频推理代码解读

热门文章

  1. 分鱼问题c语言,五人分鱼问题(附答案)
  2. 禁用form表单select置灰_UI设计中置灰功能总结
  3. elasticsearch ingest-attachment 对于 word、pdf等文件内容的索引
  4. neuoj Blurred Pictures(小思维题
  5. ApiPost与PostMan,你可以任选一款不错的接口管理工具
  6. 突发!中国顶级程序员左耳朵耗子(陈皓)去世
  7. SHP转换为SLPK
  8. 分享4款非常实用的黑科技APP,使用过后才发现离不开它们了
  9. unity语音聊天--亲加通讯云(Android/iOS)---android
  10. 网易视频云互动直播公测正式启动