riv bzoj-1812 IOI-2006

题目大意:给定一棵n个点树,要求在上面建立k个收集站。点有点权,边有边权,整棵树的代价是每个点的点权乘以它和它的最近的祖先收集站的距离积的和。

注释:$1\le n \le 100$,$1\le k \le 50$。


想法:显然,这是一道树形dp题。状态也非常容易... ...只不过,我们好像要枚举子集...

所以,我们这里有一个黑科技:多叉树转二叉树。

我们先把它转成二叉树,然后再进行转移即可。

状态:dp[i][j][k]表示以i为根的子树中选出j个为伐木场且在i的祖先中距离i最近的伐木场为k时,将以i为子树的所有木头都运到k的最小花费。

转移略,傻逼转移。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 110
#define K 60
using namespace std;
int rs[N],ls[N],dp[N][N][K],cost[N],fa[N],dist[N];
int flag,n,k;
void dfs(int pos)
{
if(!pos&&flag) return; flag=1;
dfs(ls[pos]); dfs(rs[pos]);
int len=dist[pos];
for(int i=fa[pos];i+1;i=fa[i])
{
for(int j=0;j<=k;j++)
{
for(int l=0;l<=j;l++)
{
if(j-l-1>=0)
dp[pos][i][j]=min(dp[pos][i][j],dp[ls[pos]][pos][l]+dp[rs[pos]][i][j-l-1]);
if(j-l>=0)
dp[pos][i][j]=min(dp[pos][i][j],dp[ls[pos]][i][l]+dp[rs[pos]][i][j-l]+len*cost[pos]);
}
}
len+=dist[i];
}
}
int main()
{
cin >> n >> k ;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&cost[i],&fa[i],&dist[i]);
rs[i]=ls[fa[i]];
ls[fa[i]]=i;
}
memset(dp,0x3f,sizeof dp);
memset(dp[0],0,sizeof dp[0]);
fa[0]=-1;
dfs(0);
printf("%d\n",dp[ls[0]][0][k]);
return 0;
}

小结:好题,我们发现状态简单,转移需要让自己分担和的话,可以想想多叉树转二叉树。

[bzoj1812][IOI2006]riv_多叉树转二叉树_树形dp的更多相关文章

  1. BZOJ_1864_[Zjoi2006]三色二叉树_树形DP

    BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...

  2. 三色二叉树_树形DP

    Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序 ...

  3. 【BZOJ1812】riv(多叉树转二叉树,树形DP)

    题意:给定一棵树,每个点有权值,每条边有边权(单向边).你可以选取K个黑点,使得从每个点移动到距离他最近的黑点的花费(距离*点权)的总和最小. n<=100 k<=50 w[i],a[i] ...

  4. BZOJ_1495_[NOI2006]网络收费_树形DP

    BZOJ_1495_[NOI2006]网络收费_树形DP Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而, 不可忽视的一点就 ...

  5. BZOJ_3573_[Hnoi2014]米特运输_树形DP+hash

    BZOJ_3573_[Hnoi2014]米特运输_树形DP+hash 题意: 给你一棵树每个点有一个权值,要求修改最少的权值,使得每个节点的权值等于其儿子的权值和且儿子的权值都相等. 分析: 首先我们 ...

  6. B20J_4027_[HEOI2015]兔子与樱花_树形DP

    B20J_4027_[HEOI2015]兔子与樱花_树形DP 题意: 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编 ...

  7. BZOJ_1040_[ZJOI2008]骑士_树形DP

    BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...

  8. BZOJ_1060_时态同步_树形DP

    BZOJ_1060_时态同步_树形DP 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1060 分析:水水的树形DP. 用儿子的最大值更新父亲, ...

  9. BZOJ_1827_[Usaco2010 Mar]gather 奶牛大集会_树形DP

    BZOJ_1827_[Usaco2010 Mar]gather 奶牛大集会_树形DP 题意:Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来 ...

随机推荐

  1. ognl表达式注意事项

    1.在jsp页面中: <s:a action="departmentAction_delete.action?did="></s:a> 说明:   1.st ...

  2. Treap(模板)

    人生第一次平衡树,Treap板子 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  3. RHEL6.5安装成功ORACLE11GR2之后,编写PROC程序出错解决方法

    1.  proc: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file: N ...

  4. MVC系列学习(九)-DTO的使用

    本次学习用的数据库,如下 1.什么是DTO:DataTransferObject 即数据传输对象,服务端的客户端的通信,自动定义个小的实体类,里面只包含我们需要传输的属性 2.不用DTO会有什么问题 ...

  5. 《Java编程的逻辑》第一部分 编程基础与二进制

  6. CSS——text-indent

    在h1标签里套入a标签并写上文字,有利于seo,但是文字如何隐藏呢?一般都是a标签变成内联块并首行缩进为负值. <!DOCTYPE html> <html lang="en ...

  7. mysql常用命令介绍

    mysql适用于在Internet上存取数据,支持多种平台 1.主键:唯一标识表中每行的这个列,没有主键更新或删除表中的特定行很困难. 2.连接mysql可以用Navicat 要读取数据库中的内容先要 ...

  8. 5.C#编写Redis访问类

    那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问Redis. 这里我们使用的库为: StackExchange.Redis GitHub:https://gi ...

  9. ARM架构与体系学习(二)——3级流水线

    ARM架构与体系学习(二)——3级流水线 标签: 存储嵌入式汇编c 2012-04-18 00:44 5414人阅读 评论(4) 收藏 举报  分类: ARM7(16)  版权声明:本文为博主原创文章 ...

  10. 安装nodejs6.9x以后,原来在nodejs4.2.x中运行正常的ionic项目出现问题的解决

    安装nodejs6.9x以后,原来在nodejs4.2.x中运行正常的程序出现的问题.看错误信息,由于NodeJs版本升级导致的. 到提示的目录下运行:npm rebuild node-sass -g ...