51Nod-1353-树
来源:互联网 发布:linux 删除逻辑卷 编辑:程序博客网 时间:2024/05/23 02:05
ACM模版
描述
题解
这个题做出来的人很少,看了看官方题解,如下:
我们令
对于 u 的一个孩子 v 可以得到转移方程
另外
这样乍看是
最后答案即为
这个题虽然有官方题解,但是看着我也是一脸懵逼,只是清楚的知道这是一个树归,思前想后,于是找到了一个 AC 代码研究了一番,大致算是明白了,但是状态转移方程依然是似懂非懂……如果哪个大牛有高见,烦指教~~~
暂且说一下我的理解,因为这里是平衡树,所以没有确定几个分叉,只是确定高度差不大于一,所以我的理解是,一棵以 u 为根的树,无论去哪一棵子树,并且这个子树的根是 u 的孩子,那么最后一定都满足平衡,本着这样的思路,利用乘法原理可以得到如上转移方程。
不知我的理解是否有偏差,如果有的话,烦请告知!
代码
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MAXN = 2222;const int MOD = 1e9 + 7;int n, k;int tot = 0;int pre[MAXN];int dp[MAXN][MAXN];int s[MAXN];struct edge{ int next; int to;} e[MAXN << 1];void AND_MOD(int &x, int y){ x += y; if (x >= MOD) { x -= MOD; }}void dfs(int u, int fa){ dp[u][s[u] = 1] = 1; for (int it = pre[u]; it; it = e[it].next) { if (e[it].to == fa) { continue; } dfs(e[it].to, u); for (int i = s[u]; i > 0; i--) { for (int j = s[e[it].to]; j > 0; j--) { AND_MOD(dp[u][i + j], (long long)dp[u][i] * dp[e[it].to][j] % MOD); } dp[u][i] = (long long)dp[u][i] * dp[e[it].to][0] % MOD; } s[u] += s[e[it].to]; } for (int i = k; i <= s[u]; i++) { AND_MOD(dp[u][0], dp[u][i]); }}int main(){ cin >> n >> k; int u, v; for (int i = 1; i < n; ++i) { scanf("%d%d", &u, &v); e[++tot] = (edge){pre[u], v}; pre[u] = tot; e[++tot] = (edge){pre[v], u}; pre[v] = tot; } dfs(1, -1); printf("%d\n", dp[1][0]); return 0;}
阅读全文
0 0
- 51Nod-1353-树
- 51nod 1631 线段树
- 51nod 1364 线段树
- 51nod 1672 线段树
- 51nod 1588 幸运树
- 51nod-1424 零树
- 51Nod - 1640 生成树
- 51Nod-1424-零树
- 51nod 1424 零树
- 51Nod-1868-彩色树
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 剑指offer——连续子数组的最大和_
- ubuntu 16.04安装opencv3.0流程以及报错解决
- 无题 (贪心)
- 深度学习与计算机视觉系列(1)_基础介绍
- LNMP 自动安装包 V1.4 版发布
- 51Nod-1353-树
- 常用cmd指令,linux控制台指令,QT的gcc环境安装(不断更新)
- 学习Linux命令(20)
- 朝阳
- jquery源码对jsonp的解读
- Java微信公众平台开发之自定义菜单
- 转发与重定向的区别
- 美国要求签证申请人提供社交媒体账号
- Android Study 之聊聊权限那点事儿~别怕,就是干~!!!