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. 使用display:flex;实现垂直水平居中

    body,div{margin:0px;padding:0px;} .flex-container{display:flex;height:300px;background-color:#ddd;ju ...

  2. codevs3370 选学霸(背包dp,并查集)

    3372 选学霸  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相 ...

  3. mongoDB的基本用法

    一.MongoDB初识 什么是MongoDB MongoDB是一个基于分布式文件存储的数据库.由c++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  4. C/C++ Python的函数默认参数

    发现C/C++  Python的函数可以使用默认参数,来减少传参时候的参数个数. 但是:这样的默认参数最好是不变对象! #include <stdio.h> #include <st ...

  5. Unity实现屏幕抖动效果(通过Camera Viewpoint实现)

    由于游戏死亡时一般都需要屏幕抖一下下. 所以百度了下相关写法,发现方法很多~~~ 找来找去,找到个简单粗暴地,啥都不需要,一个脚本拖动到Camera上就可以了 略微修改了一点点,share一下 usi ...

  6. 如何下载JDK和JRE历史版本

    首先进入网址http://www.oracle.com/technetwork/java/javase/downloads/index.html 然后页面滑到最下面,选择[Java Archive]后 ...

  7. html5——网络状态

    我们可以通过window.onLine来检测,用户当前的网络状况,返回一个布尔值 window.addEventListener("online",function(){ aler ...

  8. js分页插件

    //分页插件1function showView(option) {    //参数定义id,页容量,当前页,总数,页总数    var id = option.id,         pageSiz ...

  9. 配置本地git服务器(gitblit win7)

    title: 配置本地git服务器 date: 2017年3月7日22:43:14 gitblit(不用安装) 进入gitblit-1.8.0\data下,编辑gitblit.properties和d ...

  10. java实例1

    1.满天星星 import java.awt.*; public class xinxin { public static void main(String[] args) { Frame w = n ...