T1题面:

 输入点数为N一棵树

 求树上长度恰好为K的路径个数

 (n < 1e5, k < 500)

  这是今天的考试题,也是一道假的紫题,因为我一个根本不会dp的蒟蒻只知道状态就一遍A掉了……(然后我当时不会……emm)

  考虑f[i][j]表示点i为根的子树中深度为j的点的个数,初始设置f[i][0] = 1。转移的时候,每搞完一棵子树就用这棵子树内的数据用乘法原理更新ans,然后再把它的贡献累加给根,这样可以保证统计不重不漏。

  也可以用点分治来做。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #define maxn 50010
  4. using namespace std;
  5. template <typename T>
  6. void read(T &x) {
  7. x = 0;
  8. int f = 1;
  9. char ch = getchar();
  10. while (!isdigit(ch)) {
  11. if (ch == '-')
  12. f = -1;
  13. ch = getchar();
  14. }
  15. while (isdigit(ch)) {
  16. x = x * 10 + (ch ^ 48);
  17. ch = getchar();
  18. }
  19. x *= f;
  20. return;
  21. }
  22. void open_file(string s) {
  23. string In = s + ".in", Out = s + ".out";
  24. freopen(In.c_str(), "r", stdin);
  25. freopen(Out.c_str(), "w", stdout);
  26. }
  27. int head[maxn], top, n, k;
  28. struct E {
  29. int to, nxt;
  30. } edge[maxn << 1];
  31. inline void insert(int u, int v) {
  32. edge[++top] = (E) {v, head[u]};
  33. head[u] = top;
  34. }
  35. int f[maxn][510];//第二维j表示深度为j的点数
  36. long long ans;
  37. void dp(int u, int pre) {
  38. for (int i = head[u]; i; i = edge[i].nxt) {
  39. int v = edge[i].to;
  40. if (v == pre)
  41. continue;
  42. dp(v, u);
  43. for (int i = 0; i < k; ++i) //先统计答案
  44. ans += f[u][i] * f[v][k-i-1];
  45. for (int i = 1; i <= k; ++i) //算贡献
  46. f[u][i] += f[v][i-1];
  47. }
  48. return;
  49. }
  50. int main() {
  51. //  open_file("distance");
  52. read(n), read(k);
  53. int u, v;
  54. for (int i = 1; i < n; ++i) {
  55. read(u), read(v);
  56. insert(u, v), insert(v, u);
  57. }
  58. for (int i = 1; i <= n; ++i)
  59. f[i][0] = 1;
  60. dp(1, 0);
  61. printf("%I64d\n", ans);
  62. return 0;
  63. }

  T2题面就不放了。这是一道树形dp的入门题。

  考虑每个点可以有选与不选两种状态,设f[i][0]表示不选这个点后以该点为根的最大贡献,f[i][1]表示选。我们可以自底向顶转移,有f[u][1] = w[u] + sigma(f[v][0]),f[u][0] = sigma(max(f[v][0], f[v][1])。注意第二个方程中选不选子节点是都可以的,要注意这种比较松的限制可能遗漏。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #define maxn 6010
  4. template <typename T>
  5. void read(T &x) {
  6. x = 0;
  7. int f = 1;
  8. char ch = getchar();
  9. while (!isdigit(ch)) {
  10. if (ch == '-')
  11. f = -1;
  12. ch = getchar();
  13. }
  14. while (isdigit(ch)) {
  15. x = x * 10 + (ch ^ 48);
  16. ch = getchar();
  17. }
  18. x *= f;
  19. return;
  20. }
  21. using namespace std;
  22. int head[maxn], top;
  23. struct E {
  24. int to, nxt;
  25. } edge[maxn << 1];
  26. inline void insert(int u, int v) {
  27. edge[++top] = (E) {v, head[u]};
  28. head[u] = top;
  29. }
  30. int f[maxn][2], w[maxn], ind[maxn], n, root;
  31. void dp(int u) {
  32. f[u][1] = w[u];
  33. for (int i = head[u]; i; i = edge[i].nxt) {
  34. int v = edge[i].to;
  35. dp(v);
  36. f[u][1] += f[v][0];
  37. f[u][0] += max(f[v][1], f[v][0]);
  38. }
  39. return;
  40. }
  41. int main() {
  42. read(n);
  43. for (int i = 1; i <= n; ++i)
  44. read(w[i]);
  45. int u, v;
  46. for (int i = 1; i < n; ++i) {
  47. read(u), read(v);
  48. insert(v, u);
  49. ++ind[u];
  50. }
  51. for (int i = 1; i <= n; ++i)
  52. if (!ind[i]) {
  53. root = i;
  54. break;
  55. }
  56. dp(root);
  57. printf("%d", max(f[root][0], f[root][1]));
  58. return 0;
  59. }

【树形dp】【CF161D】distance on a tree + 【P1352】没有上司的舞会的更多相关文章

  1. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  2. 洛谷 p1352 没有上司的舞会 题解

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...

  3. 洛谷P1352 没有上司的舞会——树形DP

    第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...

  4. P1352 没有上司的舞会——树形DP入门

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...

  5. 洛谷P1352 没有上司的舞会 [2017年5月计划 清北学堂51精英班Day3]

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子 结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职 ...

  6. luogu P1352 没有上司的舞会 x

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...

  7. P1352 没有上司的舞会&&树形DP入门

    https://www.luogu.com.cn/problem/P1352 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...

  8. [luogu]P1352 没有上司的舞会[树形DP]

    本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...

  9. 【树形dp】Bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏

    Description     约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报 复.她打算破坏刚建成的约翰的网络.    约翰的网络是树形的,连接着N(1≤N≤1000 ...

  10. 洛谷 P1352 没有上司的舞会【树形DP】(经典)

    <题目链接> <转载于>>> > 题目描述: 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...

随机推荐

  1. C. Vladik and Memorable Trip 解析(思維、DP)

    Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...

  2. 【论文阅读】An Empirical Study of Architectural Decay in Open-Source Software

    2020-06-19这篇文章是我学习 软件架构与中间件 课程时分享的论文.可以说,这篇文章塑造了我基本的科研观,也养成了我如今看论文的习惯.感谢老师们,也感谢恒恒对我的帮助. 论文地址: https: ...

  3. eclipse配置springMVC

    基础还是创建一个Dynamic web project. WEB-INF/lib中添加必需的jar. commons-logging-1.1.3.jar spring-aop-4.3.6.RELEAS ...

  4. Luogu P6830 [IOI2020]Connecting Supertrees

    题意 好复杂,我就不写了. 题解 口胡了一下,发现我居然会 IOI 的题? 首先发现有 \(3\) 一定不合法,因为连通块里面有一个环的话 \(p_{i,j}\) 最多为 \(2\),有两个环的话就存 ...

  5. NB-IOT基站的优势和特点

    NB-IOT基站是什么        NB-IOT基站的主要目的是完成移动通信网和UE之间的通信和管理功能,在移动通信中是组成蜂窝小区最基本的单元.只有在基站信号的覆盖范围之内通过运营商网络连接的NB ...

  6. git同步源码到gitee和github

    如何把我们的源码同步到gitee或github远程仓库中 同步方式分以下几种: 1.命令同步    先查看下我们是否有远程仓库:git remote -v 如有就要删除远程仓库或是同命令覆盖,如全新安 ...

  7. [Luogu P1613]跑路 (DP+倍增+最短路)

    题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我 ...

  8. centos 6.5 时间网络同步

    安装 ntpdate sudo yum -y install ntp ntpdate 修改为上海时区 sudo vim /etc/sysconfig/clock ZONE = "Asia/S ...

  9. 服务网格istio概念应知应会

    一.背景 最近架构组基于istio开发了服务网格(Service Mesh)平台,借此机会把相关的背景知识做一次学习和记录,方便回头查看. 初版的效果: 二.istio 官方手册:https://is ...

  10. 微软发布.net 6,net5 RC2

    2020-11-13 更新 .net 6 SDK https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.100-alpha.1.20562.2/dotnet-s ...