BZOJ 4033 树形DP
http://blog.csdn.net/mirrorgray/article/details/51123741
安利队长blog…
树形dp吧,状态挺显然的,dp[x][j]表示以x为根的子树中,选择了j个黑点的答案,但注意这个答案是整棵树的答案。
我们只需要对于每个儿子背包一遍,在最后更新一下dp[x][j]即可,具体可以看一眼程序。
非常重要的是,这个复杂度是n^2的,需要注意的是,如果我们要保证复杂度,for(int j=size[x];~j;j–)for(int k=size[ver[i]];~k;k–)必须要这么写,这样实际上是枚举整棵树中两两点对之间的lca,复杂度n^2就比较显然了。
差评下别的好多题解没有说复杂度也没有证明,我找了几份题解以为n^3卡了半天发现卡不掉仔细理性分析了下才发现是n^2的,get到了树形dp的正确姿势…
如果有人因为背包挂掉请注意是不是j和k都是倒着枚举的,如果因为这里挂掉请仔细想想原因(蒟蒻表示自己也因为这里wa掉了一屏…对于背包的处理不好…)最保险的做法是memcpy,但那样常数略大…
From lyh
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N=2017;
int f[N][N],w[N*2],v[N*2],next[N*2],first[N],tot,size[N],n,k,xx,yy,zz;
void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x,int fa,int len){
size[x]=1;
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa){
dfs(v[i],x,w[i]);
for(int j=size[x];~j;j--)
for(int k=size[v[i]];~k;k--)
f[x][j+k]=max(f[x][j+k],f[v[i]][k]+f[x][j]);
size[x]+=size[v[i]];
}
for(int i=0;i<=size[x];i++)f[x][i]+=i*(k-i)*len+(size[x]-i)*(n-size[x]-k+i)*len;
}
signed main(){
memset(first,-1,sizeof(first));
scanf("%lld%lld",&n,&k);
for(int i=1;i<n;i++)scanf("%lld%lld%lld",&xx,&yy,&zz),add(xx,yy,zz),add(yy,xx,zz);
dfs(1,-1,0);
printf("%lld\n",f[1][k]);
}
BZOJ 4033 树形DP的更多相关文章
- BZOJ 1040 树形DP+环套树
就是有n个点n条边,那么有且只有一个环那么用Dfs把在环上的两个点找到.然后拆开,从这条个点分别作树形Dp即可. #include <cstdio> #include <cstrin ...
- BZOJ - 2500 树形DP乱搞
题意:给出一棵树,两个给给的人在第\(i\)天会从节点\(i\)沿着最长路径走,求最长的连续天数\([L,R]\)使得\([L,R]\)为起点的最长路径极差不超过m 求\(1\)到\(n\)的最长路经 ...
- BZOJ 4987 (树形DP)
###题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4987 ###分析 先考虑贪心,显然k个节点形成一棵树 求出树的直径,显然直径应该只被经 ...
- [USACO10MAR]伟大的奶牛聚集 BZOJ 1827 树形dp+dfs
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- bzoj 4007 树形dp
题目大意 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有下属,这种关系刚好组成一个 n 层的完全二叉树.公民 i 的下属是 2 * i 和 2 * i +1.最下层的公民即叶子节 ...
- BZOJ 1369 树形DP
思路: f[i][j] 表示节点i 染成j时 子树的最小权值 (我会猜这个j很小 你打我吖~) 随便DP一发就好了 (证明我也不会) //By SiriusRen #include <cstdi ...
- bzoj4033 [HAOI2015]树上染色——树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ 1907] 树的路径覆盖 【树形DP】
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...
随机推荐
- CDR服装设计-旗袍款式图
在服装行业中的服装款式设计.图案设计和面料设计等方面,CorelDRAW是一款常用绘图设计软件,用CorelDRAW绘制款式图比手绘更容易表达服装结构.比例.图案.色彩等要素,服装款图主要目的是为了更 ...
- javaee字符缓冲输出流
package Zjshuchu; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOExcepti ...
- 08.Web服务器-4.Web服务器动态资源请求
1 浏览器请求动态页面过程 2 WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会 ...
- Atcoder ARC 082C/D
C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...
- 将会改变未来IT世界的十种编程语言
这里要说的都是革新,说这些的目的就是要保持关注最新技术.如果你是一个程序员,想要探寻未来技术,那这篇文章就是你的必读之选.我们这里列出了10种编程语言,10种将会改变IT世界工作方式的编程语言.这些语 ...
- Ubuntu 14.04远程登录服务器
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51285545 本文讲述在Ubuntu ...
- JAVA实现多线程的两种方法
参考URL: http://www.cnblogs.com/jbelial/archive/2013/03/17/2964472.html 1.继承 java.lang.Thread 类. 2.实现R ...
- [bzoj2124]等差子序列_线段树_hash
等差子序列 bzoj-2124 题目大意:给定一个1~n的排列,问是否存在3个及以上的位置上的数构成连续的等差子序列. 注释:$1\le n\le 10^4$. 想法:这题就相当于是否存在3个数i,j ...
- codevs——T1267 老鼠的旅行
http://codevs.cn/problem/1267/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...