比较毒瘤的树形DP,子状态难想。这是主要是搬运一篇题解。

用\(f[i][j]\)表示\(i\)的子树中离\(i\)最近黑点的距离为\(j\),且距离超过\(j\)的点都被满足的方案数。转移时新建一个临时数组\(tmp\)保存转移后的\(f[x]\)。设\(y\)是\(x\)的子结点,枚举\(f[x][i]\)和\(f[y][j]\),转移如下:

  1. 若\(i+j≤2k\),则此时\(min(i,j+1)≤k\),对于长度为\(i+j+1\)的链上的所有点都可以找到一边距离\(≤k\),因此状态合并以后是合法状态,转移\(tmp[min(i,j+1)]+=f[x][i]×f[y][j]\);

  2. 若\(i+j>2k\),则此时\(max(i,j+1)>k\),链上肯定会存在一些点两边都够不到,转移\(tmp[max(i,j+1)]+=f[x][i]×f[y][j]\)。

初始状态\(f[x][0]=1\),表示不考虑子树内的情况,选择自己的方案数为\(1\);\(f[x][k+1]=1\),表示自己本身不满足,但子结点都被满足的情况,主要是方便转移。

答案为\(∑i<=kf[root][i]\)。

时间复杂度\(O(nk2)\)。

代码如下

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<forward_list>
typedef long long int64;
inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
const int N=101,K=41,mod=1e9+7;
int k,f[N][K],tmp[K];
std::forward_list<int> e[N];
inline void add_edge(const int &u,const int &v) {e[u].push_front(v);e[v].push_front(u);
}
void dfs(const int &x,const int &par) {f[x][0]=f[x][k+1]=1;for(int &y:e[x]) {if(y==par) continue;dfs(y,x);std::fill(&tmp[0],&tmp[k*2]+1,0);for(register int i=0;i<=k*2;i++) {for(register int j=0;j<=k*2;j++) {(tmp[i+j<=k*2?std::min(i,j+1):std::max(i,j+1)]+=(int64)f[x][i]*f[y][j]%mod)%=mod;}}std::copy(&tmp[0],&tmp[k*2]+1,f[x]);}
}
int main() {const int n=getint();k=getint();for(register int i=1;i<n;i++) {add_edge(getint(),getint());}dfs(1,0);int ans=0;for(register int i=0;i<=k;i++) {(ans+=f[1][i])%=mod;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/ilverene/p/10339467.html

CF735E Ostap and Tree相关推荐

  1. 【CF 736C】Ostap and Tree,树形DP

    传送门 题意:给定一棵树,把一些节点染黑,使任意节点到离它最近黑点的距离不超过k 思路: 这是一道个人认为比较好玩但也比较难写的题目 看到这个数据范围,其实还是挺蛋疼的,因为CF的机子你也不知道能跑多 ...

  2. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  3. 107. Binary Tree Level Order Traversal II

    题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...

  4. 102. Binary Tree Level Order Traversal

    题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...

  5. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  6. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  7. Code Forces Bear and Forgotten Tree 3 639B

    B. Bear and Forgotten Tree 3 time limit per test2 seconds memory limit per test256 megabytes inputst ...

  8. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  9. datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

最新文章

  1. TVM Reduction降低算力
  2. 2019中国计算机高引学者榜单出炉,164人入选!
  3. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题
  4. ecshop分页类assign_pager分析和扩展
  5. web.xml中 Log4jConfigListener配置
  6. windows 临界区
  7. 金蝶kis仓库管理系统演示_金蝶KIS专业版生产管理的系统亮点功能
  8. Mirai 新变体利用严重漏洞攻击网络安全设备
  9. JAVA接口继承、抽象类等
  10. 简单解决网课或教育平台在线学习视频鼠标检测问题
  11. 微信小程序icon图标怎么用
  12. ubuntu修改配置IP地址和DNS的方法总结(4种)
  13. 关于工业4.0和智能制造的总结以及背后的思考
  14. YII2框架AJAX请求报500错误的处理方法
  15. Bert入门学习过程记录
  16. JDP-[单例模式]-思路梳理
  17. 老闪创业那些事儿(外传)——流程下的工具人
  18. NVIDIA Cuda 7.5 on Ubuntu 14.04 64 bits
  19. 华为ENSP——ACL访问控制列表
  20. Unity实战 RTS3D即时战略游戏开发(一)

热门文章

  1. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
  2. 恩布企业IM,协同办公平台发布V1.24.2版本
  3. 知名财经大V称:京东金融遇到了点“问题”!
  4. Java NIO使用及原理分析(三)
  5. jsp 分页 tag
  6. 转:Python 代码调试技巧
  7. Java Swing 树状组件JTree的使用方法【图】
  8. 搞死了 报错【libc-client.a: could not read symbols: ...
  9. YSlow使用指南_最新2.0使用指南中文版
  10. eip协议通信_3月免费公开课伺服、通信等课程重磅发布,火热报名中