hdu2415(树上背包)
这道题好像没什么人写题解,于是写了一发
题意:有个坏蛋想要参加竞选,需要得到m个人的支持,买通第i个人(1<=i<=n)需要一个cost[i],同时这些人又有上下属关系,只要买通了领导,他的下属(可以是下属的下属)也会给你投票,问最少要花多少钱
数据范围:N<=200,m<=n;
其实就是比较裸的树上分组背包,每个子节点的背包是一个组,选自己也是一个组,dfs搞一搞就好了,然而字符串处理实在恶心.....
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
using namespace std;
const int MAX=<<;
int n,m;
map<string,int>dui;
vector<int>arr[];
char str[],tmp[];
int dp[][],fa[],siz[],cost[],cnt=;
void dfs1(int now)
{
int i,j;
siz[now]=;
for(i=;i<arr[now].size();i++)
{
int v=arr[now][i];
dfs1(v);
siz[now]+=siz[v];
}
}
void dfs(int now)
{
int i,j,k;
for(i=;i<arr[now].size();i++)
{
dfs(arr[now][i]);
int v=arr[now][i];
for(j=m;j>=;j--)for(k=;k<=j;k++)dp[now][j]=min(dp[now][j],dp[now][j-k]+dp[v][k]);
}
if(now!=n+)for(i=;i<=min(m,siz[now]);i++)dp[now][i]=min(cost[now],dp[now][i]);
return ;
}
int main()
{
int i,j;
char ss[];
while(scanf("%s",ss)!=EOF)
{
n=;
cnt=;
if(ss[]=='#')return ;
for(i=;i<strlen(ss);i++)n*=,n+=ss[i]-'';
scanf("%d",&m);
int i,j;
for(i=;i<=n+;i++)arr[i].clear();
dui.clear();
getchar();
for(i=;i<=n+;i++)fa[i]=i;
for(i=;i<n;i++)
{
gets(str);
int len=strlen(str);
for(j=;j<len;j++)if(str[j]==' ')break;
int pos=j;
memset(tmp,,sizeof(tmp));
for(j=;j<pos;j++)tmp[j]=str[j];
string a=tmp;
if(!dui[a])dui[a]=++cnt;
int name1=dui[a],costs=;
while(str[pos]>''||str[pos]<'')pos++;
for(j=pos;;j++)
{
if(str[j]=='\0'||str[j]>''||str[j]<'')
{
pos=j;
break;
}
costs*=;
costs+=str[j]-'';
}
cost[name1]=costs;
int nums=;
string b;
for(j=pos+;j<len;j++)
{
if(str[j]!=' ')
{
tmp[nums++]=str[j];
if(str[j+]==' '||str[j+]=='\0')
{
tmp[nums++]='\0';
b=tmp;
nums=;
if(!dui[b])dui[b]=++cnt;
int name2=dui[b];
arr[name1].push_back(name2);
fa[name2]=name1;
}
}
}
}
for(i=;i<=n+;i++)
{
dp[i][]=;
for(j=;j<=m;j++)dp[i][j]=MAX;
}
for(i=;i<=n;i++)if(fa[i]==i)arr[n+].push_back(i);
dfs1(n+);
dfs(n+);
printf("%d\n",dp[n+][m]);
}
}
/*
9 5
A 45 B C
B 20
C 30
D 60 E F
E 20
F 50 G H
G 10
H 25 I
I 15
*/
hdu2415(树上背包)的更多相关文章
- HDU4044 GeoDefense(有点不一样的树上背包)
题目大概说一棵n个结点的树,每个结点都可以安装某一规格的一个塔,塔有价格和能量两个属性.现在一个敌人从1点出发但不知道他会怎么走,如果他经过一个结点的塔那他就会被塔攻击失去塔能量的HP,如果HP小于等 ...
- luogu 2014 选课 树上背包
树上背包 #include<bits/stdc++.h> using namespace std; ; const int inf=0x3f3f3f3f; vector<int> ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
- 洛谷 P2015 二叉苹果树 (树上背包)
洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...
- 【BZOJ】4033: [HAOI2015]树上染色 树上背包
[题目]#2124. 「HAOI2015」树上染色 [题意]给定n个点的带边权树,要求将k个点染成黑色,使得 [ 黑点的两两距离和+白点的两两距离和 ] 最大.n<=2000. [算法]树上背包 ...
- 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
[题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...
- bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】
01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...
- luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ...
- 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)
树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...
随机推荐
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- 关于RFID2.4G 标签卡最新方案
它是一款针对RFID有源卡行业设计的,是一款单向的2.4G频段RF射频芯片,目前主要针对低功耗的校讯通, 2.4G停车场,电动车防盗, 闪光灯设备(引闪器) ,智能家居等领域.SI24R2E 同样与S ...
- zabbix监控Elasticsearch集群
本节以 zabbix 为例,介绍如何使用监控系统完成 Elasticsearch 的监控报警. github 上有好几个版本的 ESZabbix 仓库,都源自 Elastic 公司员工 unterge ...
- Android依赖管理与私服搭建
在Android开发中,一个项目需要依赖许多的库,我们自己写的,第三方的等等,这篇文件介绍的就是自己搭建私服,创建自己的仓库,进行对我们自己写的库依赖管理.本文是在 mac book pro 环境上搭 ...
- 拥抱Node.js 8.0,N-API入门极简例子
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. N-API简介 Node.js 8.0 在2017年6月份发布, ...
- c++概括
c++到底是什么样的语言 在过去的几十年,计算机技术的发展令人吃惊,当前的笔记本电脑的计算速度和存储信息的能力超过了20世纪60年代的大型机.20世纪七十年代,C和Pascal语言引领人们进入结构化编 ...
- Docker化tomcat 并且使用maven热部署
今天没事干 就把自己的tomcat docker化并且使用maven实现热部署 特别记录一下~ 1.首先进行centos7的安装 就不在记录了 注意的是最好使用centos7 因为docker 依赖 ...
- 高性能队列Disruptor系列1--传统队列的不足
在前一篇文章Java中的阻塞队列(BlockingQueue)中介绍了Java中的阻塞队列.从性能上我们能得出一个结论:数组优于链表,CAS优于锁.那么有没有一种队列,通过数组的方式实现,而且采用无锁 ...
- OC对象之旅 weak弱引用实现分析
Runtime学习 -- weak应用源码学习 Runtime源码分析,带你了解OC实现过程.其中参考了大量的大神的代码以及文献,里面也有个人的见解,欢迎拍砖,欢迎交流. 两种常见使用场景 /// ...
- 关于JS跨域问题的解决
这里不提供什么高深的代码了,只说明一个解决跨域问题的方法,个人觉得这个方法是最方便也是最有效的. 那就是一用不同源的JS,虽然JS不允许不同源的访问,但是可以引用不同源的JS,用这样的方法我们可以引用 ...