树形dp hdu1561
有的堡垒攻克需要攻克另一个堡垒,形成一个森林,最多攻克m个堡垒,求获得宝物的最大价值。
1,以0做根将森林形成树;
2,用背包计算当前节点下需要攻克k个堡垒能获得的宝物最大价值,但是注意同一个根节点的情况不能够先后放入背包,否则会有比如1节点选2个和选三个形成了选5个,也就是某些节点重复计算了。所以要在back第j格时将所有种k依次放入,j--;
- #include<iostream>
- #include<string.h>
- #include<stdio.h>
- #include<vector>
- using namespace std;
- const int maxa = ;
- int dp[maxa][maxa];
- int back[maxa][maxa];
- int vis[maxa][maxa];
- int v[maxa];
- vector<int> edge[maxa];
- int numb[maxa];
- int dfs(int x, int num ){//printf("%d %d\n", x, num);
- if(vis[x][num] || num == )
- return dp[x][num];
- memset(back[x], , sizeof(back[x]));
- for(int i = ; i < edge[x].size(); i ++){
- int k = edge[x][i];//printf("%d ", k);
- int last = -;
- for(int h = num-; h >= ; h--){
- for(int j = ; j <= h && j <= numb[k]; j++){
- int a = dfs(k, j);
- back[x][h] = max(back[x][h], back[x][h-j] + a);//printf("%d ", back[h]);
- }//puts("");
- }
- }
- vis[x][num] = ;
- return dp[x][num] = back[x][num-]+v[x];
- }
- int dfs1(int x){
- int sum = ;
- for(int i = ; i < edge[x].size(); i++){
- int k = edge[x][i];
- sum += dfs1(k);
- }
- return numb[x] = sum +;
- }
- int main(){
- int n, m;
- //freopen("in.cpp", "r", stdin);
- while(scanf("%d%d", &n, &m), n+m){
- memset(vis, , sizeof(vis));
- for(int i =; i <= n; i++)
- edge[i].clear();
- for(int i =; i <= n; i++){
- int a, b;
- scanf("%d%d", &a, &b);
- v[i] = b;
- edge[a].push_back(i);
- }
- dfs1();
- memset(dp, , sizeof(dp));
- printf("%d\n", dfs(, m+));
- /* for(int i = 0; i <= n; i++){
- printf("*%d ", numb[i]);
- }*/
- }
- }
树形dp hdu1561的更多相关文章
- 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534
[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
- 树形dp专辑
hdu 2196 http://acm.hdu.edu.cn/showproblem.php?pid=2196 input 5//5个结点 1 1//表示结点2到结点1有一条权值为1的边 2 1//表 ...
- 树形动态规划(树形DP)入门问题—初探 & 训练
树形DP入门 poj 2342 Anniversary party 先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...
- 树形DP小结
树形DP1.简介:树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果.tips:树的遍历 ...
- 树形 DP 总结
树形 DP 总结 本文转自:http://blog.csdn.net/angon823/article/details/52334548 介绍 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 ...
随机推荐
- php读取memcache二进制数据
memcache作为一个数据中间层,经常用来做数据交换. 比如在某个系统内部我们规定如下的用户状态的信息,每个用户只需要存续52个字节. Key state#ID 如”state#10888” Val ...
- 【学习笔记】【Foundation】数组
数组:可重复,有序 不可变数组 创建数组 //array开头的方法是类方法,init开头的是实例方法 //NSArray* arr=[[NSArray alloc]initWithObjects:@& ...
- [转] c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...
- 《EM-PLANT仿真技术教程》读书笔记(持续更新中)
1.在系统分析过程中,必须考虑系统所处的环境,因此划分系统与环境的边界是系统分析的首要任务 2.模型可以分为物理模型和数学模型.数学模型可以分为解析模型.逻辑模型.网络模型以及仿真模型.模型可以分为离 ...
- STL,ATL,WTL的联系与区别
STL 即 Standard Template Library STL(标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov. ...
- CentOS 6.4 编译Open vSwitch2.0
1. 安装依赖软件 yum install automake openssl-devel rpmrebuild kernel-devel make redhat-rpm-config gcc redh ...
- DES加解密实现方式
private static readonly byte[] _keys = { 0x22, 0x84, 0x56, 0x98, 0x90, 0xAB, 0xpD, 0xEF }; private s ...
- 《Node.js开发指南》知识整理
Node.js简介 Node是一个可以让JavaScript运行在服务器端的平台,抛弃了传统平台依靠多线程来实现高并发的设计思路,而采用单线程.异步式I/O.事件驱动式的程序设计模型. 安装和配置No ...
- 关于Python中的for循环控制语句
#第一个:求 50 - 100 之间的质数 import mathfor i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) ...
- convert app to 64-bit for ios7
https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Introd ...