Solved:3

rank:187

H.travel

题意:给一颗带有点权的树 找三条不相交的链 使得点权最大

题解:使用树形DP dp[x][i][0/1] 表示x节点选择i条链 有没有经过x的链

   对于每一个回溯的状态 下面的结点已经处理好了

   但是处理当前结点时还有一种有两条经过x的链 实际上他们可以合成一条链

   为了避免重复计算 经过当前结点的权值在更新时计算

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; int n;
ll val[];
ll dp[][][];
vector<int> g[]; void dfs(int x, int fa)
{
ll tmp[][]; ll f[][];
for(int i = ; i < ; i++) tmp[i][] = tmp[i][] = tmp[i][] = ;
for(int i = ; i < g[x].size(); i++)
{
int v = g[x][i];
if(v == fa) continue;
dfs(v, x);
memcpy(f, tmp, sizeof(tmp)); for(int a = ; a < ; a++)
for(int b = ; b < ; b++)
{
if(a + b > ) continue;
for(int c = ; c < ; c++)
for(int d = ; d < ; d++)
{
if(c + d > ) continue;
tmp[a + b][c + d] = max(tmp[a + b][c + d], f[a][c] + dp[v][b][d]);
}
}
}
for(int i = ; i < ; i++)
{
dp[x][i][] = max(dp[x][i][], tmp[i][]);
dp[x][i][] = max(dp[x][i][], tmp[i][] + val[x]); if(i < )
{
for(int j = ; j < ; j++)
for(int k = j + ; k < ; k++)
dp[x][i + ][j] = max(dp[x][i + ][j], tmp[i][k] + val[x]);
}
}
} int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%lld", &val[i]);
for(int i = ; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(, -);
ll ans = ;
for(int i = ; i < ; i++) ans = max(ans, dp[][i][]);
printf("%lld\n", ans);
return ;
}
/*
13
10 10 10 10 10 1 10 10 10 1 10 10 10
1 2
2 3
3 4
4 5
2 6
6 7
7 8
7 9
6 10
10 11
11 12
11 13
*/

  

牛客多校Round 2的更多相关文章

  1. 牛客多校Round 10

    咕咕咕.... 去烽火台和兵马俑了

  2. 牛客多校Round 9

    Solved:1 rank:112 E. Music Game 题解说有个非简化的原题 bzoj4318 #include <bits/stdc++.h> using namespace ...

  3. 牛客多校Round 8

    Solved:2 rank:164 签了两个oeis,但这样真的开心嘛

  4. 牛客多校Round 6

    Solved:3 rank:156 J. Heritage of skywalker 学习一下nth_element 可以o (n)的找出前多少大的元素 #include <bits/stdc+ ...

  5. 牛客多校Round 5

    Solved:3 rank:195 F. take 官方题解:小 A 在打开第 i 个箱子后会交换手中的钻石和第 i 个箱子中的钻石 当且仅当第 i个箱子的钻石是前 i 个箱子打开后出现的所有钻石里最 ...

  6. 牛客多校Round 4

    Soved:3 rank:133 A.Ternay String 欧拉降幂一下 但是反复求phi会超时 但mod是同一个就可以记忆化一下 #include <bits/stdc++.h> ...

  7. 牛客多校Round 3

    Solved:2 rank:306 跑路场..... A.PACM team 简单背包记录路径都写挂 退役算了 #include <bits/stdc++.h> using namespa ...

  8. 牛客多校Round 1

    Solved:1 rank:249 E. Removal dp i,j表示前i个数删除了j个且选择了第i个的答案 类似字符串的dp 预处理一下nex i_k即i后面k第一次出现的位置  就好转移了 # ...

  9. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

随机推荐

  1. 【OI】关于斯特林数的简单理解

    斯特林数分为第一类斯特林数:S1(n,k)和第二类斯特林数:S2(n,k). S1(n,k)代表在n个元素中选出k个环的方案数,S2(n,k)代表在n个元素中选出k个非空集合的方案数, 不同之处在于, ...

  2. 动态更改Menu

    好像没有现成的api可能获取menu完美方法,只有在创建menu时,用全局的menuItem记下, 在需要修改时修改. 1)全局量: MenuItem  gMenuItem=NULL; 2)//创建菜 ...

  3. ASP.NET Core开发Docker部署

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  4. 实现SpringBoot登录

    SpringBoot登录 https://www.cnblogs.com/jiekzou/p/9303871.html 通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如 ...

  5. SPOJ BEADS 最小字符串表示

    SPOJ BEADS 给一个字符串(环) 问从哪个字符开始,字典序最小. 可以脑补到很多线性的解法,不过以下这个是最简单的,代码非常简单,就不解释了. #include<iostream> ...

  6. uva1563

    https://vjudge.net/problem/UVA-1563 高斯消元解同余方程组 就是把原来的除法换成逆元,其他的都一样 #include<bits/stdc++.h> usi ...

  7. POJ 2452 Sticks Problem (暴力或者rmq+二分)

    题意:给你一组数a[n],求满足a[i] < a[k] < a[j] (i <= k <= j)的最大的 j - i . 析:在比赛时,我是暴力做的,虽然错了好多次,后来说理解 ...

  8. MySQL 备份和恢复数据

    备份指定数据库的全部表或指定表 mysqldump -u user -h localhost -p [password] db_name[ tbl_name[,tbl_name.......]]> ...

  9. [C陷阱和缺陷] 第5章 库函数

      有关库函数的使用,我们能给出的最好建议是尽量使用系统头文件,当然也可以自己造轮子,随个人喜好.本章将探讨某些常用的库函数,以及编程者在使用它们的过程中可能出错之处.   5.1 返回整数的getc ...

  10. Shape Drawable Resources

    1,示例 它们的代码如下: shape_oval.xml <?xml version="1.0" encoding="utf-8"?> <sh ...