题目链接

【JSOI 2018】潜入行动


题目大意

求nnn个节点的树上大小为k" role="presentation" style="position: relative;">kkk的覆盖集个数。本题中一个被标记的点可以覆盖所有与之相邻的点,但是不能覆盖其本身。
n≤100000n≤100000n\le 100000,m≤100m≤100m\le 100


题解

dp[ver][cnt][0/1][0/1]dp[ver][cnt][0/1][0/1]dp[ver][cnt][0/1][0/1]表示节点ververver的子树中选出cntcntcnt个节点,其中选了/不选节点ververver,ververver是/否被覆盖的方案数量。
状态转移方程见代码。
但是,暴力转移会超时。
那就加一个优化:每个节点ververver的子树中最多选size[ver]size[ver]size[ver]个节点。
算一下size[ver]size[ver]size[ver]就可以啦。


代码

#include <cstdio>
const int maxn = 100005;
const int maxm = 105;
const int maxe = 200005;
const int mod = 1e9+7;
typedef unsigned long long ull;
int n, m, sz[maxn], dp[maxn][maxm][2][2];
int tot, ter[maxe], nxt[maxe], lnk[maxn];
ull cur[maxm][2][2];
inline void upd(int &a, int b) {a += b, a -= (a >= mod ? mod : 0);
}
inline int min(const int &a, const int &b) {return a < b ? a : b;
}
void addedge(int u, int v) {ter[++tot] = v;nxt[tot] = lnk[u];lnk[u] = tot;
}
void treedp(int u, int p) {sz[u] = 1;dp[u][0][0][0] = 1;dp[u][1][1][0] = 1;for (int i = lnk[u]; i; i = nxt[i]) {int v = ter[i];if (v == p) continue;treedp(v, u);int bound0 = min(m, sz[u]), bound1 = min(m, sz[v]);for (int x = 0; x <= bound0; x++)for (int x0 = 0; x0 <= 1; x0++)for (int x1 = 0; x1 <= 1; x1++)cur[x][x0][x1] = dp[u][x][x0][x1], dp[u][x][x0][x1] = 0;for (int x0 = 0; x0 <= bound0; x0++)for (int x1 = 0; x1 <= bound1 && x0 + x1 <= m; x1++) {upd(dp[u][x0 + x1][0][0], cur[x0][0][0] * dp[v][x1][0][1] % mod);upd(dp[u][x0 + x1][0][1], (cur[x0][0][0] * dp[v][x1][1][1] + cur[x0][0][1] * (dp[v][x1][0][1] + dp[v][x1][1][1])) % mod);upd(dp[u][x0 + x1][1][0], cur[x0][1][0] * (dp[v][x1][0][0] + dp[v][x1][0][1]) % mod);upd(dp[u][x0 + x1][1][1], (cur[x0][1][0] * (dp[v][x1][1][0] + dp[v][x1][1][1]) + cur[x0][1][1] * (dp[v][x1][0][0] + dp[v][x1][1][0]) + cur[x0][1][1] * (dp[v][x1][0][1] + dp[v][x1][1][1])) % mod);}sz[u] += sz[v];}/*我可以用来 debug 程序!for (int x = 0; x <= m; x++)for (int x0 = 0; x0 <= 1; x0++)for (int x1 = 0; x1 <= 1; x1++)printf("dp[%d][%d][%d][%d] = %d\n", u, x, x0, x1, dp[u][x][x0][x1]);*/
}
int main() {scanf("%d %d", &n, &m);for (int u, v, i = 1; i < n; i++) {scanf("%d %d", &u, &v);addedge(u, v), addedge(v, u);}treedp(1, 0);printf("%d\n", (dp[1][m][0][1] + dp[1][m][1][1]) % mod);return 0;
}

【JSOI 2018】潜入行动(树形动态规划)相关推荐

  1. HDU1520 Anniversary party 树形动态规划

    HDU1520 Anniversary party 树形动态规划 Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  2. 蓝桥杯 算法训练(四)结点选择(树形动态规划)

    结点选择(树形动态规划)C语言 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多少? 输入格式 第一 ...

  3. c++ 不撞南墙不回头——树形动态规划(树规)

    不撞南墙不回头--树规总结                                         焦作一中信息学oy 之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而 ...

  4. 不撞南墙不回头——树形动态规划(树规)

    不撞南墙不回头--树规总结                                         焦作一中信息学oy 之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而 ...

  5. Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树形动态规划)

    原题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801 题意: ...

  6. 假如我是儿子——树形动态规划

    --来自焦作一中卢裕东 想给这篇总结起个霸气又有意义的名字,翻来覆去,想到了今年暑假在郑州的NOIP夏令营,朱全民老师讲树规时说的一句惊天动地的话,那时给我们举例子,就有了这句:假如我是儿子!好吧,我 ...

  7. 一本通提高篇 树形动态规划

    先写个考试 鸽着~ 考试有树 d p dp dp紫题 我回来了 每年联赛基本都有好几道题时树 d p dp dp,这块一定得好好学 U P D : 20201109 UPD:20201109 UPD: ...

  8. JSOI 2018 Round 1 游记

    清明时节雨纷纷,路上行人欲断魂. 一年一度的JSOI,已在不觉中来临. 无论是LGM神犇,抑或只是初一蒟蒻,尽在这不大的赛场中相遇--他们无不在用一行行代码,谱写出自己被OI所充实的青春. [以上:伪 ...

  9. JSOI 2018 Round 2 游记

    五一小长假方才结束,便迎来了江苏省选Round 2. 一切都是未知的--题目毒瘤与否?未知:djq能否翻盘,未知:FizzyDavid能否AK?未知-- 据说,一些来自浙江的选手也去了呢--那么,我兴 ...

最新文章

  1. 科学界5个终极难题,如果有一个被解决,人类文明将升级
  2. 完美日记的微服务实践和优化思路
  3. Zero Copy 简介
  4. python3 UnicodeEncodeError: 'ascii' 错误
  5. 透明怎么弄_最新版微信如何设置透明背景?这样设置,效果令人惊喜
  6. 三校生计算机word基础知识,三校生计算机第一次月考计算机基础、word.doc
  7. golang 安装 guru vscode 安装失败
  8. java swing浏览器_浏览器控件JxBrowser Swing开发者快速入门指南
  9. java web课程报告_java web课程设计报告.doc
  10. 最长公共子串(动态规划)
  11. 家谱排版一般用什么软件
  12. threejs开启对数深度缓存区时、着色器深度混乱
  13. python饼状图显示其比例_python可视化:matplotlib绘制的饼状图你了解吗?
  14. 怎么批量查询银行卡号是哪个银行
  15. 通过js实现图片爆炸特效
  16. ES6(ECMAScript)快速使用
  17. 【ReactJs学习笔记总目录】
  18. Java实现多文件生成压缩包下载
  19. 获取java可用时区列表ZoneId
  20. macbook android 屏幕共享,苹果设备小技巧:iPhone,iPad,Mac进行屏幕共享和远程控制...

热门文章

  1. Linux内核学习笔记(一) 虚拟文件系统VFS
  2. 12地教师社招公告已出,深圳教招即将时发布?这些报考条件你需要了解
  3. php获取中文拼音(含生僻字,多音字,音标)支持首字母,全拼
  4. 今日头条自媒体怎么快速涨粉呢?利用这个方法,涨粉超快
  5. 单片机的c语言应用程序设计答案第六版,单片机C语言应用程序设计马忠梅课后习题答案...
  6. 计算机图形学笔记(一),色彩讲义
  7. 微平均 宏平均 微平均(准确率、召回率、f1-score相等) 以及 TP、TN、FP、FN的理解
  8. 一个自学前端的4年工作总结【三十而立,拒绝躺平】
  9. 《程序猿技术大咖》微信交流群
  10. 网络客户/服务器程序