算法提高 金属采集 树形DP
题目链接:金属采集
思路: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的更多相关文章
- 蓝桥杯 算法提高 金属采集 [ 树形dp 经典 ]
传送门 算法提高 金属采集 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫 ...
- 算法提高 金属采集_树形dp
算法提高 金属采集 时间限制:1.0s 内存限制:256.0MB 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连 ...
- 算法笔记_166:算法提高 金属采集(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共 ...
- Java实现 蓝桥杯 算法提高金属采集
问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共有 n 个节点,这些节点被编号为 1~n .人类将 ...
- 算法提高 矩阵乘法 区间DP
这是神题,n <= 1000,如果是极限数据普通的n^3区间DP怎么可能过?可偏偏就过了. 刘汝佳大哥的训练指南上面说的存在nlgn的算法解决矩阵链乘问题,可是百度都找不到.... AC代码 # ...
- 算法提高 金陵十三钗 状压DP
思路:深度搜索复杂度N!过不了.考虑动态规划:将已经选择的列记为1,未选择表示0,二进制压缩,例如110,就表示选择了第1列和第2列. d(i, t)表示当前已经匹配了i行,选择了t这些列.状态转移: ...
- 算法提高 合并石子(DP)
问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...
- 算法提高 拿糖果 线性DP
题目链接:拿糖果 思路:首先给小于根号n的素数打表.d(i)表示当前剩余i颗糖,最多可以拿到多少糖. 转移方程:d(i) = max(d(i), k + d(i - 2 * k)),此处k表示 ...
- tarjan算法求缩点+树形DP求直径
hdu4612 Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
随机推荐
- xml格式字符串转为Map
import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom ...
- x64内核HOOK技术之拦截进程.拦截线程.拦截模块
x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可. 但是 ...
- Log4j扩展使用--自定义输出
写在前面的话 log4j支持自定义的输出.所有的输出都实现了自Appender接口.一般来说,自定义输出值需要继承AppenderSkeleton类,并实现几个方法就可以了. 写这篇博客,我主要也是想 ...
- junit设计模式--适配器模式
适配器(Adapter)模式 在软件系统中,由于环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种" ...
- 国内不谈java
今天晚上在整理电脑,不知道怎么回事,电脑里面放着一篇文章.打开一看写的挺好的,现在就贴出来,望共勉. 国内不谈java--会有千万人跳出来和你争嘴的.越是如此,我越是不忍心不说出来,越是不不忍心看 ...
- tp5中设置指定的log日志,可单独建立文件夹和文件名
1:在D:\www\tp5\thinkphp\library\think\Log.php中添加下列代码.可在runtime文件夹下建立tlogs文件夹(可自定义). /** * [payLog 支付日 ...
- Linux tar 解压的时候报错
报错如下: # tar zxvf php-7.1.6.tar.gz gzip: stdin: not in gzip format tar: Child returned status 1 tar: ...
- Git 2.0 更改 push default
近期更新了git,项目push时会提示这样的信息: warning: push.default 尚未设置,它的默认值在 Git 2.0 已从 'matching' 变更为 'simple'.若要不再显 ...
- records.config文件参数解释
# Process Records Config File # # <RECORD-TYPE> <NAME> <TYPE> <VALUE (till end ...
- wxpython发布还自己图标的程序
在py2exe安装脚本文件中,修改代码: setup( windows=[ { 'script': 'myapp.py', 'icon_resources': [(1, 'myicon.ico')] ...