[DP之树形DP]
树形dp出了应该还是比计数dp要简单的 因为很好可以看出来
常用的是一个F记录子树内的 一个G记录子树外的 还有一种就是有环的做过要用状压搞一下
不说这么多直接上例题
| [HAOI2015]T1 |
经典的树形dp 这个转移有点难想 比较不常规 通常树形dp都是几乎是O(1)转移的 这个转移是N的 所有总的时间复杂度是N^2的 等等讲细一点
首先我们可以染k个点 第一个想的就是F[i][k]表示第i个点为子树可以染k个点 然后的话就从下往上维护 这个好像有点经典 维护的方法 第一次接触有点难
它的维护方法就像一个一次装箱 但是的话好像这个装箱有点复杂 因为有很多个点 然后的话我是这么搞得
首先我们单单是维护子树下的话是有点难搞的 因为有些黑点你要找到它的lca然后才把路径扫 这样的话 我们直接维护这个子树的黑点和白点已经确定了的费用
也就是黑白点在外面的一定要过我到孩子的边 我就统计一下 外面的白色点*里面的白色点*这条边的权值 这个就是这个状态这条边做出的贡献 黑点一样做
然后我们维护一个点的子树 一个个子树和根节点合并 假设我根结点现在已经有i个黑点 下面有j个黑点 那么就转移到F[i+j] 当然这样的时候会重复叠加 也就是
当i=0 j=1时算了一个F[i+j]的状态 到i=1 j=0的时候 就会加上我当前F[i+j]的状态 然后的话就会错了 所以我们要一个数组保存以上上一个状态避免这种情况 这个细节很重要
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define Maxn 2010
using namespace std;
typedef long long LL;
struct node
{
LL x,y,d,next;
}edge[Maxn*]; LL len,first[Maxn];
void ins(LL x,LL y,LL d){len++; edge[len].x=x; edge[len].y=y; edge[len].d=d; edge[len].next=first[x]; first[x]=len;}
LL N,K; LL size[Maxn]; LL w[Maxn]; LL F[Maxn][Maxn]; LL G[Maxn];
void Dfs(LL x,LL fa)
{
size[x]=;
for(LL k=first[x];k!=-;k=edge[k].next)
{
LL y=edge[k].y;
if(y!=fa)
{
w[y]=edge[k].d; Dfs(y,x);
for(LL i=;i<=min(size[x],K);i++) G[i]=F[x][i]; for(LL i=;i<=min(size[x],K);i++)
for(LL j=;j<=min(size[y],K);j++)
if(i+j<=K)
F[x][i+j]=max(F[x][i+j],G[i]+F[y][j]);
size[x]+=size[y];
}
}
if(x!=)
for(LL i=;i<=min(size[x],K);i++)
F[x][i]=F[x][i]+(i*(K-i)*w[x])+((size[x]-i)*(N-K+i-size[x])*w[x]);
}
int main()
{
scanf("%lld%lld",&N,&K); len=; memset(first,-,sizeof(first));
for(LL i=;i<N;i++){LL x,y,d; scanf("%lld%lld%lld",&x,&y,&d); ins(x,y,d); ins(y,x,d);}
memset(F,,sizeof(F));
Dfs(,); return printf("%lld\n",F[][K]),;
}
/*
3 1
1 2 1
1 3 2
*/
[DP之树形DP]的更多相关文章
- DP系列——树形DP(Codeforces543D-Road Improvement)
一.题目链接 http://codeforces.com/problemset/problem/543/D 二.题意 给一棵树,一开始所有路都是坏的.询问,以每个节点$i$为树根,要求从树根节点到其他 ...
- CF123E Maze(期望dp,树形dp,式子)
题目大意: 给你一棵树,边权都是1,每一个点有一个是起点的概率和一个是终点的概率,你将以起点为根,开始在树上随机dfs,每到一个点,就会将他的所有儿子随机打乱成序列,然后按照那个随机顺序走完,直到走到 ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- 树形动态规划(树形DP)入门问题—初探 & 训练
树形DP入门 poj 2342 Anniversary party 先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...
- [P2996][USACO10NOV]拜访奶牛Visiting Cows (树形DP)
之前写在洛谷,结果没保存,作废…… 听说考前写题解RP++哦 思路 很容易想到是 树形DP 如果树形DP不知道是什么的话推荐百度一下 我在这里用vector储存边 设状态f[i][0]为i点不访问,f ...
- 树形DP(超详细!!!)
一.概念 1.什么是树型动态规划 树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺 ...
- Codeforces1223E. Paint the Tree(树形dp)
题目链接:传送门 题目大意: 给出节点数为n的一棵带权树,和每个点的最大染色数k.一条边的权重w能产生价值w的条件是,这条边的两端的点至少有一个颜色相同.颜色种类数无限,但每种只能使用两次,问能产生的 ...
- 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463
B - Strategic game POJ - 1463 题目大意:给你一棵树,让你放最少的东西来覆盖所有的边 这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...
随机推荐
- 从Http它被连接到WebSocket
1.HTTP协议长期-fi支持和各支持的浏览器 http://blog.csdn.net/fenglibing/article/details/7100222 2.WEBclient与服务端信息交互的 ...
- linux sendmail 邮件服务器架设(fedora 8)
linux sendmail 邮件服务器架设(fedora 8) 2009-01-22 17:27 3316人阅读 评论(2) 收藏 举报 邮件服务器linuxprotocolscaching测试lo ...
- Xamarin.Android
Xamarin.Android之使用百度地图起始篇 一.前言 如今跨平台开发层出不穷,而对于.NET而言时下最流行的当然还是Xamarin,不仅仅能够让我们在熟悉的Vs下利用C#开发,在对原生态类库的 ...
- DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?
DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)? 阅读目录: 问题根源是什么? <领域驱动设计-软件核心复杂性应对之道>分层概念 Repositor ...
- Manager(管理器)
Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的 ...
- glibc-2.19 之 strlen 实现
前几天遇到一个有意思的问题,实现strlen 不考虑线程安全: 下面是我的实现: size_t strlen(const char* s) { const char* p = s; while (*p ...
- 实现 ready和bind事件
Jquery揭秘系列:实现 ready和bind事件 讲这一节之前,先回顾之前的一篇<小谈Jquery>里面的代码: (function (win) { var _$ = functi ...
- 释放c盘空间
Win7的系统引导盘用着用着会越来越小.怎么办呢?我以前在网上查过资料,说是找个工具加大C盘.我加了,从原来的20G加到现在的35G.用了一段时间后,空间又只剩几百M了.难道又要加?? 后来,在网上找 ...
- c#一个简单的实例告诉你,多继承还可以这么来
我想多继承,要怎么搞???我想你一定会说“接口”,那么你有没有遇到这样的问题,你需要在一个类中继承另外2个类的所有方法,你要怎么做呢???难道要Coyp实现代码?No,往下看... 定义一个空接口比如 ...
- intellij idea 学习
intellij idea是一个java的ide.由jetbrain开发. intellij idea快捷键 快捷键 说明 备注 Ctrl+N 快速导航到类 类似于Resharper中的C ...