BZOJ_1812_[Ioi2005]riv_树形DP
BZOJ_1812_[Ioi2005]riv_树形DP
Description
Input
Output
Sample Input
1 0 1
1 1 10
10 2 5
1 2 3
Sample Output
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 205
int head[N],to[N],nxt[N],val[N],w[N],cnt,fa[N][N],siz[N],sf[N],dis[N],g[N][N],m,n;
int f[N][N][N];
inline void add(int u,int v,int z) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=z;
}
void dfs(int x) {
int i,j,k,l;siz[x]=1;
fa[x][0]=x;
for(i=0;i<=sf[x];i++) {
f[x][i][!i]=(dis[x]-dis[fa[x][i]])*w[x];
}
for(i=head[x];i;i=nxt[i]) {
dis[to[i]]=dis[x]+val[i];
for(j=0;j<=sf[x];j++) fa[to[i]][++sf[to[i]]]=fa[x][j];
dfs(to[i]);
memset(g,0x3f,sizeof(g));
for(j=0;j<=sf[x];j++) {
for(k=min(m,siz[x]);k>=0;k--) {
for(l=min(m-k,siz[to[i]]);l>=0;l--) {
g[j][k+l]=min(g[j][k+l],f[x][j][k]+min(f[to[i]][j+1][l],f[to[i]][0][l]));
}
}
}
siz[x]+=siz[to[i]];
for(j=0;j<=sf[x];j++) {
for(k=min(m,siz[x]);k>=0;k--) {
f[x][j][k]=g[j][k];
}
}
}
}
int main() {
memset(f,0x3f,sizeof(f));
// freopen("riv.in","r",stdin);
// freopen("riv.out","w",stdout);
scanf("%d%d",&n,&m);m++;
int i,z;
for(i=1;i<=n;i++) {
scanf("%d%d%d",&w[i],&fa[i][1],&z);
add(fa[i][1],i,z);
}
dfs(0);
printf("%d\n",f[0][0][m]);
}
/*
4 2
1 0 1
1 1 10
10 2 5
1 2 3
*/ /*
8 2
233 0 5
9 1 80
27 2 20
64 1 100
2 3 14
81 4 5
10 3 70
10 5 8
*/
BZOJ_1812_[Ioi2005]riv_树形DP的更多相关文章
- 【BZOJ1812】[Ioi2005]riv 树形DP
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...
- BZOJ 1812: [Ioi2005]riv( 树形dp )
树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ----------- ...
- BZOJ1812: [Ioi2005]riv(树形dp)
题意 题目链接 Sol 首先一个很显然的思路是直接用\(f[i][j] / g[i][j]\)表示\(i\)的子树中选了\(j\)个节点,该节点是否选的最小权值.但是直接这样然后按照树形背包的套路转移 ...
- rivers ioi2005 树形dp
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法, ...
- [bzoj1812][IOI2006]riv_多叉树转二叉树_树形dp
riv bzoj-1812 IOI-2006 题目大意:给定一棵n个点树,要求在上面建立k个收集站.点有点权,边有边权,整棵树的代价是每个点的点权乘以它和它的最近的祖先收集站的距离积的和. 注释:$1 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- 不拖控件的asp.net编程方法——第1回
以前写的asp.net程序基本上都用了webfrom的控件编写的,当然有个好处就是易入门.快速效率高,但感觉自己这了几个小系统,还是没学到什么东西,感觉心里没底,因为都是封装好的东西,拿来就用的,功能 ...
- 2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683
本文原创于 2014-02-12 09:26. 今复习之用,有新体会,故重新编辑. 2014-02-12 09:26: 2-sat之第二斩!昨天看了半天论文(赵爽的和俉昱的),终于看明白了!好激动有 ...
- ffmpeg实时编码解码部分代码
程序分为编码端和解码端,两端通过tcp socket通信,编码端一边编码一边将编码后的数据发送给解码端.解码端一边接收数据一边将解码得到的帧显示出来. 代码中的编码端编码的是实时屏幕截图. 代码调用 ...
- 【Todo】Java学习笔记 100==100 & Reflection API & Optional类详解 & DIP、IoC、DI & token/cookie/session管理会话方式
为什么1000 == 1000返回为False,而100 == 100会返回为True? Link Java Reflection API:Link Java8 Optional 类深度解析: L ...
- STM8S---选项字节(Option Byte)写操作之IO复用
功能实现目标 通过对选项字节的写操作来实现TIM2的CH3通道的PWM输出IO复用.能够设置为PA3或者PD2输出. 通过STVP方式操作链接 选项字节 选项字节包含芯片硬件特性的配置和存储器 ...
- Raspberry Pi学习笔记
一.树莓派 Raspberry Pi 更换国内源 编辑 /etc/apt/sources.list 文件,用 nano 命令编辑 pi@raspberrypi:~$ sudo cp /etc/apt/ ...
- 转:linux下共享库的注意点之-fpic
转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...
- Solidworks工程图 如何绘制向视图,辅助视图
先画一条垂直于视野方向的中心线 点击辅助视图,然后点选刚才的中心线即可生成向视图 对向视图的标准可以得到一些用其他方法不好标注的尺寸
- fetch 函数分装
1.fetch /** * 封装 fetch */ import { hashHistory } from 'react-router'; export default function reques ...
- vc常用类总结(转载)
常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, i ...