题目链接:金属采集

思路: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. Log4j扩展使用--日志记录器Logger

    OK,现在我们认真的研究下Logger的配置,进行相关配置扩展. Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).其中,Logger负责记录 ...

  2. java 中的instanceof

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  3. Spring MVC (JDK8+Tomcat8)

    1 Spring MVC概述 Spring MVC是Spring为表现层提供的基于MVC设计理念的优秀的web框架,是目前最主流的MVC框架之一. Spring3.0后全面超越Struts2,成为最优 ...

  4. 2017noip普及组赛前注意事项总结

    petr 大神镇场 距人生第一场noip只差4天半了(好紧张) 总结几下四道题的做题策略 NO1 第一题一般是送分的,认真读题,别太草率,多想几遍再动手,把重要的地方圈一圈.画一画,自己找几个数据多试 ...

  5. 怎么使用IDEA

    war 和 war exploded war部署首先通过IDEA生成.war工程文件,然后将WEB工程以包的形式上传到服务器,因此会替代服务器本来同名的web app项目. war exploded模 ...

  6. jQuery中的选择器及筛选器

    1.jQuery的介绍 1.jQuery是继prototype之后又一个优秀的Javascript框架.其宗旨是--WRITE LESS,DO MORE! 2.它是轻量级的js库,这是其它的js库所不 ...

  7. iOS-image图片压缩

    ///压缩图片 + (NSData *)imageCompressToData:(UIImage *)image{ NSData *data=UIImageJPEGRepresentation(ima ...

  8. BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]

    3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...

  9. 关于WebAPI

    1. 现在越来越多的企业以及网站 以及互联网使用WebApi  .那么WebApi 和 普通的WebServices  和WCF 最大的区别是什么了.那就是Web API很多人都会想到Web服务,但是 ...

  10. Orleans例子源码

    这是Orleans系列文章中的一篇.首篇文章在此 我共享以下我现在写教程的简单的Orleans例子源码. 这个代码已经是我为了写word改动过了的.不过大体内容是通用的. 我写博客总体想法是:去除所有 ...