这道题好像没什么人写题解,于是写了一发

题意:有个坏蛋想要参加竞选,需要得到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(树上背包)的更多相关文章

  1. HDU4044 GeoDefense(有点不一样的树上背包)

    题目大概说一棵n个结点的树,每个结点都可以安装某一规格的一个塔,塔有价格和能量两个属性.现在一个敌人从1点出发但不知道他会怎么走,如果他经过一个结点的塔那他就会被塔攻击失去塔能量的HP,如果HP小于等 ...

  2. luogu 2014 选课 树上背包

    树上背包 #include<bits/stdc++.h> using namespace std; ; const int inf=0x3f3f3f3f; vector<int> ...

  3. BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划

    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...

  4. 洛谷 P2015 二叉苹果树 (树上背包)

    洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...

  5. 【BZOJ】4033: [HAOI2015]树上染色 树上背包

    [题目]#2124. 「HAOI2015」树上染色 [题意]给定n个点的带边权树,要求将k个点染成黑色,使得 [ 黑点的两两距离和+白点的两两距离和 ] 最大.n<=2000. [算法]树上背包 ...

  6. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...

  7. bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】

    01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...

  8. luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ...

  9. 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)

    树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...

随机推荐

  1. [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码

    在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生 ...

  2. C#基础篇--静态成员、抽象成员、接口

    1.静态成员: 静态成员(static).静态类与实例成员.类: 静态成员属于类所有,非静态成员属于类的实例所有. 静态成员不能标记为 Virtual,Abstract,Override,也就是说静态 ...

  3. spring mvc 存取值

    (转) 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServletR ...

  4. JAVA POI 应用系列(1)--生成Excel

    POI简介(官网:http://poi.apache.org/)     Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...

  5. 纯CSS3向右循环闪过效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  6. jsp+servlet实现模糊查询和分页效果

    ---恢复内容开始--- 1.DAO+MVC包 2.DAO接口方法定义 package com.wanczy.dao; import java.math.BigDecimal;import java. ...

  7. iOS CAReplicatorLayer 实现脉冲动画效果

    iOS CAReplicatorLayer 实现脉冲动画效果 效果图 脉冲数量.速度.半径.透明度.渐变颜色.方向等都可以设置.可以用于地图标注(Annotation).按钮长按动画效果(例如录音按钮 ...

  8. .net 利用Emit将object转为DbParameter,DataTable转为List<>

    先放测试结果图,测试的方法是拷贝了老赵的一个简单的性能计数器:CodeTimer.发现速度还是比利用反射来获取快了2倍左右的,将object转为DbParameter的反射方法我没写.         ...

  9. 【2017-06-05】Jquery.ajax

    AJAX  是一种网页数据异步加载技术 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 一.Json     ...

  10. 创建对象的N种模式

    1 new Object() 先创建一个Object实例,然后为它添加属性和方法 var Person = new Object() Person.name = 'hl' Person.sayName ...