Description

​ 有一棵树,每个点有一个权值,找到一个权值最大的"乙烷"模型。

​ "乙烷"模型是指:

​ 其中黑点表示可以有0个或多个点。

Sample Input

  1. 8
  2. 1 1 1 1 1 1 1 1 //点权
  3. 1 2 //建树
  4. 1 3
  5. 1 4
  6. 1 5
  7. 2 6
  8. 2 7
  9. 2 8

Sample Output

  1. 8

​ 看到这道题有点蒙,想了一会儿想出是树形DP了,就是不会写,就想着打个暴力,还没打对。。。(我吐了)

​ 这道题正解就是树形DP,我们考虑它的状态是什么。

​ (我们cjh学长的画功真是太厉害了!)

​ 0代表一个点,1代表一条链,2代表两条链...

​ 那转移呢?

​ \(x\)代表父亲节点,\(to\)代表\(x\)的一个儿子。

​ 我们是从叶子节点向根节点转移的,所以当\(x\)状态为0,\(to\)状态为1时,它是无法转移到一个合法的状态的(可以手画画)。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <vector>
  5. #include <cstring>
  6. using namespace std;
  7. inline long long read() {
  8. long long s = 0, f = 1; char ch;
  9. while(!isdigit(ch = getchar())) (ch == '-') && (f = -f);
  10. for(s = ch ^ 48;isdigit(ch = getchar()); s = (s << 1) + (s << 3) + (ch ^ 48));
  11. return s * f;
  12. }
  13. const int N = 1e5 + 5, inf = 1e9;
  14. int n;
  15. long long ans;
  16. int a[N];
  17. long long f[N][8];
  18. vector <int> son[N];
  19. void init() {
  20. n = read();
  21. for(int i = 1;i <= n; i++) a[i] = read();
  22. for(int i = 1, x, y;i <= n - 1; i++) {
  23. x = read(); y = read();
  24. son[x].push_back(y);
  25. son[y].push_back(x);
  26. }
  27. memset(f, 0xf3, sizeof(f));
  28. }
  29. void dfs(int x, int fa) {
  30. f[x][0] = a[x];
  31. long long tmp[8];
  32. for(int i = 0;i < (int)son[x].size(); i++) {
  33. int y = son[x][i]; if(y == fa) continue;
  34. // cout << x << " " << y << endl;
  35. dfs(y, x);
  36. long long *u = f[x], *v = f[y];
  37. for(int j = 0;j < 8; j++) tmp[j] = u[j];
  38. tmp[1] = max(tmp[1], u[0] + max(v[0], v[1]));
  39. tmp[2] = max(tmp[2], u[1] + max(v[0], v[1]));
  40. tmp[3] = max(tmp[3], u[2] + max(v[0], v[1]));
  41. tmp[4] = max(tmp[4], u[0] + max(v[3], v[4]));
  42. tmp[5] = max(tmp[5], u[4] + max(v[0], v[1]));
  43. tmp[5] = max(tmp[5], u[1] + max(v[3], v[4]));
  44. tmp[6] = max(tmp[6], u[5] + max(v[0], v[1]));
  45. tmp[6] = max(tmp[6], u[2] + max(v[3], v[4]));
  46. tmp[7] = max(tmp[7], u[0] + max(v[6], v[7]));
  47. // for(int j = 0;j < 8; j++) cout << tmp[j] << " ";
  48. // cout << endl;
  49. ans = max(ans, tmp[7]);
  50. ans = max(ans, max(u[3], u[4]) + max(v[3], v[4]));
  51. ans = max(ans, max(u[6], u[7]) + max(v[0], v[1]));
  52. // cout << ans << endl;
  53. for(int j = 0;j < 8; j++) u[j] = tmp[j];
  54. }
  55. }
  56. void work() {
  57. ans = -inf;
  58. dfs(1, 0);
  59. printf("%lld", ans);
  60. }
  61. int main() {
  62. freopen("misaka.in","r",stdin); freopen("misaka.out","w",stdout);
  63. init();
  64. work();
  65. fclose(stdin); fclose(stdout);
  66. return 0;
  67. }

(貌似这题是有点恶心哈)

0827考试 T1的更多相关文章

  1. 考试T1总结(又CE?!)

    考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...

  2. 某考试T1 game

    题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...

  3. 某考试 T1 arg

    题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 输入格式 第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A. 输出格式 ...

  4. 某考试 T1 lcm

    把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...

  5. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  6. 2019.2.14 考试T1 FFT

    \(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...

  7. 某考试 T1 fair (18.5.1版)

    转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2 ...

  8. 某考试 T1 str

    一开始死磕sam,发现根本没法做...... 后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊! 就是假设我们要让 s1[1] 映射到 ...

  9. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

随机推荐

  1. 老哥,您看我这篇Java集合,还有机会评优吗?

    集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...

  2. 并发|WEB服务器并发

    面试中容易被问到你们服务器的并发是多少?但是这个问题我问过许多人,没有得到一个准确的答案!我总结了一些不错的回答,分享给大家! 面试题: 你们公司的服务器并发是多少? 我的回答: 1.并发这个词,许多 ...

  3. Echarts图表随浏览器大小,模块大小,位置实时更新

    1.图表位置随浏览器大小改变 2.图表位置随模块的改变而改变 只需要在事件函数中添加:

  4. redis(一)内部机制的介绍和启动过程

    redis(一)内部机制的介绍和启动过程 redis的基本介绍 redis服务端 redis客户端 redis的持久化 redis中的文件事件和时间时间 redis的启动过程 redis的基本介绍 r ...

  5. Vuex mapAction的基本使用

    mapAction-store中的异步方法 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new ...

  6. Python多进程实现并行化随机森林

    文章目录 1. 前言 2. 随机森林原理 3.实现原理 3.1并行化训练 3.1.1训练函数 3.1.2 单进程训练函数 生成数据集模块--生成部分数据集 单进程训练函数代码 3.2 并行化预测 3. ...

  7. golang 复数

    目录 1.声明/赋值/初始化 2.类型 3.取虚实部数值 4.运算 5.注意 跳转 1.声明/赋值/初始化 var name complex128 =complex(x,v) name := comp ...

  8. scanf函数与getchar函数

    #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h&g ...

  9. 【Gin-API系列】Gin中间件之日志模块(四)

    日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...

  10. JQ选择器总结

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...