51Nod1353 树

传送门

思路

我们定义\(dp[i][j]\)代表第i个点联通块大小为j的方案总数,也可以把它理解为等待分配(不确定归属)的联通块大小为j的方案总数。

那么每次转移我们就使用一个类似背包的东西来统计答案。

对于一个节点的每个儿子,我们只需要从大到小遍历所有可用的j_nowj_now上限就是所有遍历过的点子树大小的和)。然后再枚举这个儿子的j_son,那么显然我们就获得了很多第i个点联通块大小为j_son+j_now的方案。dp[i][j_son+j_now]+=dp[i][j_now]*dp[son][j_son]累计一下答案即可。需要注意的是,j_now需要从大往小遍历,因为反过来的话方案会算重(自己想一下01背包和完全背包)。另外,j_son是可以为0的,dp[son][0]代表son这个点只会包含在son子树内的联通块。所以对于每一个j_now都需要dp[now][j_now]*=dp[son][0]

在状态转移完后,对于每一个\(j\geq k\)我们都要执行操作dp[now][0]+=dp[now][j]。相当于分了一块大小为j的联通块。想一想就知道为什么了。

其实就是道树形依赖背包的模版。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define maxn 2050
#define mod (int)(1e9+7)
using namespace std;
ll dp[maxn][maxn],ans;
int head[maxn],cnt,n,k,size[maxn];
struct gg {
int u,v,next;
}side[maxn*2];
void insert(int u,int v) {
struct gg add={u,v,head[u]};side[++cnt]=add;head[u]=cnt;
}
void dfs(int now,int fa) {
size[now]=1;
dp[now][1]=1;
for(int i=head[now];i;i=side[i].next) {
int v=side[i].v;if(v==fa)continue;
dfs(v,now);
for(int j1=size[now];j1>=1;j1--) {
for(int j2=1;j2<=size[v];j2++) {
dp[now][j1+j2]+=(dp[now][j1]*dp[v][j2])%mod;dp[now][j1+j2]%=mod;
}
dp[now][j1]*=dp[v][0];dp[now][j1]%=mod;
}
size[now]+=size[v];
}
for(int i=k;i<=size[now];i++)dp[now][0]+=dp[now][i],dp[now][0]%=mod;
}
int main() {
scanf("%d%d",&n,&k);
for(int i=1;i<n;i++) {
int a,b;scanf("%d%d",&a,&b);insert(a,b);insert(b,a);
}
dfs(1,0);
for(int i=k;i<=n;i++)ans+=dp[1][i],ans%=mod;
printf("%lld",ans);
return 0;
}

最新文章

  1. GJM : Unity3D HIAR -【 快速入门 】 八、开发云识别应用
  2. tracert-命令小结
  3. IOS第七天(6:UiTableView编辑模式, 拖动位置 ,滑动删除)
  4. 字符串子串查找strstr
  5. &lt;我的外骨骼,诺基&gt;后的访谈
  6. 【2017-03-12】SQL Sever 子查询、聚合函数
  7. 提纲挈领webrtc之vad检测
  8. 使用NPOI导出导入导出Excel
  9. 云服务器Windows Server2012 配置http服务器(又称Web服务器,IIS)
  10. Spring Cloud 微服务笔记(六)Spring Cloud Hystrix
  11. windows中在vs code终端使用bash
  12. CMFCToolBar、CMFCStatusBar
  13. 【python游戏编程04--加载位图与常用的数学函数】
  14. git初始化本地项目及关联github远程库
  15. Jmeter获取接口返回数组的长度
  16. 格式化输出的方法:%、.format()、f
  17. mysql-ubuntu卸载安装mysql
  18. Spring源码阅读(四)
  19. ALGO-157_蓝桥杯_算法训练_阶乘末尾(高精度)
  20. Java_4 引用类型变量 Scanner与Random的使用

热门文章

  1. 【转】.Net程序员学习Linux最简单的方法
  2. kvm虚拟机日常管理与配置
  3. MySQL如何定位慢sql
  4. js获取页面所有搜索条件
  5. 安全漏洞系列(二)---站点信息侦测(C# MVC)
  6. 分享几套2019年各大公司最新的PHP面试题,几斤几两一试便知
  7. Dr. Memory Quickstart Instructions in Chinese
  8. cpio建立、还原备份档
  9. flink batch wordcount
  10. ETL DAG调度策略