题目链接:金属采集

思路:d(i, j)表示在以i为根结点的子树中使用j个机器人的最小花费。设v为u的一个子节点,从节点i使用k个机器人收集以v为根结点的能量,状态转移方程为d(u, i) = min(d(u, i - k) + d(v, k) + cost * k)  1 <= k <= i. 注意d(u, i - k)表示用i - k个机器人去收集其他子树的能量的最小花费,在遍历所有子节点之后,d(u, i)的值才会固定。

   AC代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
const int maxn = 1e5 + 5;
int dp[maxn][12]; 

struct node{
	int son, cost;
	node() {
	}
	node(int son, int cost):son(son), cost(cost) {
	}
};
vector<node>road[maxn];

int n, s, cnt;

void dfs(int u, int pre) { //u-当前节点,pre-它的父节点
	int n = road[u].size();
	for(int i = 0; i < n; ++i) {
		int v= road[u][i].son, cost = road[u][i].cost;
		if(v == pre) continue;
		dfs(v, u);
		// 只考虑当前节点和已经发现的节点
		for(int k = cnt; k >= 0; --k) { //该子树停留的机器人总数
		//逆序枚举--如果d(u, k)更新,那么不能影响d(u,k+1),如果顺序枚举会影响
			dp[u][k] += dp[v][0] + cost * 2; //让一个机器人遍历该子树所有子节点并返回的花费
			for(int j = 1; j <= k; ++j) {    //至少一个机器人进入子树
				dp[u][k] = min(dp[u][k], dp[u][k-j] + dp[v][j] + j * cost);
			}
		}
 	}
}

int main() {

	while(scanf("%d%d%d", &n, &s, &cnt) == 3) {
		memset(dp, 0, sizeof(dp));
		for(int i = 0; i <= n; ++i) road[i].clear();
		int x, y, cost;
		for(int i = 1; i < n; ++i) {
			scanf("%d%d%d", &x, &y, &cost);
			road[x-1].push_back(node(y-1, cost));
			road[y-1].push_back(node(x-1, cost));
		}
		dfs(s - 1, -1);
		printf("%d\n", dp[s - 1][cnt]);
	}
	return 0;
}

如有不当之处欢迎指出!

算法提高 金属采集 树形DP的更多相关文章

  1. 蓝桥杯 算法提高 金属采集 [ 树形dp 经典 ]

    传送门 算法提高 金属采集 时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫 ...

  2. 算法提高 金属采集_树形dp

    算法提高 金属采集   时间限制:1.0s   内存限制:256.0MB        问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连 ...

  3. 算法笔记_166:算法提高 金属采集(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共 ...

  4. Java实现 蓝桥杯 算法提高金属采集

    问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共有 n 个节点,这些节点被编号为 1~n .人类将 ...

  5. 算法提高 矩阵乘法 区间DP

    这是神题,n <= 1000,如果是极限数据普通的n^3区间DP怎么可能过?可偏偏就过了. 刘汝佳大哥的训练指南上面说的存在nlgn的算法解决矩阵链乘问题,可是百度都找不到.... AC代码 # ...

  6. 算法提高 金陵十三钗 状压DP

    思路:深度搜索复杂度N!过不了.考虑动态规划:将已经选择的列记为1,未选择表示0,二进制压缩,例如110,就表示选择了第1列和第2列. d(i, t)表示当前已经匹配了i行,选择了t这些列.状态转移: ...

  7. 算法提高 合并石子(DP)

    问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...

  8. 算法提高 拿糖果 线性DP

    题目链接:拿糖果 思路:首先给小于根号n的素数打表.d(i)表示当前剩余i颗糖,最多可以拿到多少糖.     转移方程:d(i) = max(d(i), k + d(i - 2 * k)),此处k表示 ...

  9. tarjan算法求缩点+树形DP求直径

    hdu4612 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

随机推荐

  1. javabean内省

    何为JavaBean? JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共 ...

  2. linkin大话面向对象--包和导入

    我们现在的代码都扔在一个文件夹里面,比如以后我们做项目,是不是有可能有非常非常多的代码,那我就希望把不同功能和模块的类方便管理,放到不同的文件夹下,引出包概念. 什么是包,就一个文件目录,为了处理重名 ...

  3. Linux make nginx 的时候报错

    报错如下: `conf/koi-win' and `/usr/local/nginx/conf/koi-win' are the same file   原因: 可能在编译 nginx 的时候步骤不对 ...

  4. MySql按日期进行统计

    1 数据库字段pk_time(Varchar) 当天的数据 SELECT * FROM 表 WHERE date(fk_time) = curdate(); 当月的数据 SELECT *FROM 表 ...

  5. android 自定义控件用的定时CountDownTimer

    定时执行在一段时候后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知(译者:触发onTick方法), 下面的例子显示在一个文本框中显示一个30s倒计时: new CountdownTimer( ...

  6. 03_HTML Canvas第一天

    视频来源:麦子学院 讲师:刘慧涛 w3cshool之HTML5画布:http://www.w3school.com.cn/html5/html_5_canvas.asphtml5 canvas参考手册 ...

  7. 【转】linux grep命令

    1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 2.格式 grep [options] 3.主要参数 [options]主要参数: - ...

  8. 循环while 、do…while 、for

    循环while .do-while .for 循环结构的选择? - 当对一个条件进行一次判断时,用if语句: - 当对一个条件进行多次判断时,用while语句: 1.While 循环条件成立就会执行循 ...

  9. python绘制图形(Turtle模块)

    用python的Turtle模块可以绘制很多精美的图形,下面简单介绍一下使用方法. 需要用到的工具有python,python 的安装这里就不再细说.自行搜索. from turtle import ...

  10. 2017年总结的前端文章——CSS高级技巧汇总

    1. 页面顶部阴影 body:before{ content: ""; position: fixed; top:-10px; left:; width: 100%; height ...