CF735E Ostap and Tree
比较毒瘤的树形DP,子状态难想。这是主要是搬运一篇题解。
用\(f[i][j]\)表示\(i\)的子树中离\(i\)最近黑点的距离为\(j\),且距离超过\(j\)的点都被满足的方案数。转移时新建一个临时数组\(tmp\)保存转移后的\(f[x]\)。设\(y\)是\(x\)的子结点,枚举\(f[x][i]\)和\(f[y][j]\),转移如下:
若\(i+j≤2k\),则此时\(min(i,j+1)≤k\),对于长度为\(i+j+1\)的链上的所有点都可以找到一边距离\(≤k\),因此状态合并以后是合法状态,转移\(tmp[min(i,j+1)]+=f[x][i]×f[y][j]\);
若\(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相关推荐
- 【CF 736C】Ostap and Tree,树形DP
传送门 题意:给定一棵树,把一些节点染黑,使任意节点到离它最近黑点的距离不超过k 思路: 这是一道个人认为比较好玩但也比较难写的题目 看到这个数据范围,其实还是挺蛋疼的,因为CF的机子你也不知道能跑多 ...
- 有趣题目和认知合集(持续更新)
写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...
- 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 ...
- 102. Binary Tree Level Order Traversal
题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...
- Python---哈夫曼树---Huffman Tree
今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...
- [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- 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 ...
- Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)
Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...
- datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...
最新文章
- TVM Reduction降低算力
- 2019中国计算机高引学者榜单出炉,164人入选!
- VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题
- ecshop分页类assign_pager分析和扩展
- web.xml中 Log4jConfigListener配置
- windows 临界区
- 金蝶kis仓库管理系统演示_金蝶KIS专业版生产管理的系统亮点功能
- Mirai 新变体利用严重漏洞攻击网络安全设备
- JAVA接口继承、抽象类等
- 简单解决网课或教育平台在线学习视频鼠标检测问题
- 微信小程序icon图标怎么用
- ubuntu修改配置IP地址和DNS的方法总结(4种)
- 关于工业4.0和智能制造的总结以及背后的思考
- YII2框架AJAX请求报500错误的处理方法
- Bert入门学习过程记录
- JDP-[单例模式]-思路梳理
- 老闪创业那些事儿(外传)——流程下的工具人
- NVIDIA Cuda 7.5 on Ubuntu 14.04 64 bits
- 华为ENSP——ACL访问控制列表
- Unity实战 RTS3D即时战略游戏开发(一)
热门文章
- Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
- 恩布企业IM,协同办公平台发布V1.24.2版本
- 知名财经大V称:京东金融遇到了点“问题”!
- Java NIO使用及原理分析(三)
- jsp 分页 tag
- 转:Python 代码调试技巧
- Java Swing 树状组件JTree的使用方法【图】
- 搞死了 报错【libc-client.a: could not read symbols: ...
- YSlow使用指南_最新2.0使用指南中文版
- eip协议通信_3月免费公开课伺服、通信等课程重磅发布,火热报名中