题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价。

这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP:

  • dp[u][m]表示以u国家为根的子树贿赂m个国家的最少代价

单单这样的话转移是指数级的,其实这题就是树上背包,同HDU1516。现在觉得想明白了,其实就是所有结点为根做n次01背包,每次01背包的物品就是当前根的各个儿子。

状态加一维度表示,转移就可以不是指数级了:

  • dp[u][n][m]表示以u国家为根的前n个儿子构成的子树贿赂m个国家的最少代价

然后其实循环利用内存,像01背包一样省去一维背包从大到小枚举,然后就是那样了。。

 #include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
#define INF (1<<29)
#define MAXN 222 struct Edge{
int u,v,next;
}edge[MAXN];
int NE,head[MAXN];
void addEdge(int u,int v){
edge[NE].u=u; edge[NE].v=v; edge[NE].next=head[u];
head[u]=NE++;
} int n,k,cost[MAXN],d[MAXN][MAXN],size[MAXN];
void getsize(int u){
size[u]=;
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
getsize(v);
size[u]+=size[v];
}
}
void dfs(int u){
if(u) d[u][size[u]]=cost[u];
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
dfs(v);
for(int j=size[u]; j>=; --j){
for(int k=; k<j; ++k) d[u][j]=min(d[u][j],d[u][k]+d[v][j-k]);
}
}
} bool read(char *&s,int &t){
if(sscanf(s,"%d",&t)!=) return ;
while(*s==' ') ++s;
while(*s>='' && *s<='') ++s;
while(*s==' ') ++s;
return ;
}
bool read(char *&s,char *str){
if(sscanf(s,"%s",str)!=) return ;
while(*s==' ') ++s;
while(*s && *s!=' ') ++s;
while(*s==' ') ++s;
return ;
} char str[];
string name[MAXN<<];
int main(){
int w[MAXN]; char ts[MAXN];
while(gets(str) && str[]!='#'){
char *s=str;
read(s,n); read(s,k); int nn=;
vector<string> vec[MAXN];
for(int i=; i<n; ++i){
gets(str); s=str;
read(s,ts); name[nn++]=ts; vec[i].push_back(ts);
read(s,w[i]);
while(read(s,ts)){
name[nn++]=ts; vec[i].push_back(ts);
}
}
sort(name+,name+nn);
nn=unique(name+,name+nn)-name; NE=;
memset(head,-,sizeof(head));
int deg[MAXN]={};
for(int i=; i<n; ++i){
int u=lower_bound(name+,name+nn,vec[i][])-name;
cost[u]=w[i];
for(int j=; j<vec[i].size(); ++j){
int v=lower_bound(name+,name+nn,vec[i][j])-name;
addEdge(u,v); ++deg[v];
}
}
for(int i=; i<=n; ++i){
if(deg[i]==) addEdge(,i);
} getsize();
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j) d[i][j]=INF;
}
dfs();
int res=INF;
for(int i=k; i<=n; ++i) res=min(res,d[][i]);
printf("%d\n",res);
}
return ;
}

POJ3345 Bribing FIPA(树形DP)的更多相关文章

  1. POJ 3345 Bribing FIPA 树形DP

    题目链接: POJ 3345 Bribing FIPA 题意: 一个国家要参加一个国际组织,  需要n个国家投票,  n个国家中有控制和被控制的关系, 形成了一颗树. 比如: 国家C被国家B控制, 国 ...

  2. poj3345 Bribing FIPA【树形DP】【背包】

    Bribing FIPA Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5910   Accepted: 1850 Desc ...

  3. POJ3345 Bribing FIPA 【背包类树形dp】

    题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...

  4. poj 3345 Bribing FIPA (树形背包dp | 输入坑)

    题目链接:  poj-3345  hdu-2415 题意 有n个国家,你要获取m个国家的支持,获取第i个国家的支持就要给cost[i]的价钱    其中有一些国家是老大和小弟的关系,也就是说,如果你获 ...

  5. POJ3345 Bribing FIPA

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5021   Accepted: 1574 Description There ...

  6. 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】

    树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...

  7. 【DP_树形DP专题】题单总结

    转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...

  8. HDU 2415 Bribing FIPA

    Bribing FIPA Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  9. Bribing FIPA

    Bribing FIPA 给出多棵有n个节点的有根树,第i个节点有一个权值\(a_i\),定义一个点能控制的点为其所有的子节点和它自己,询问选出若干个点的最少的权值之和,并且能够控制大于等于m个点,\ ...

随机推荐

  1. day06_02 元组

    1.0 元组 元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组.元素卸载小括号(())里,元素之间用逗号隔开. tup1 = () #空元组 tup2 = (20 ...

  2. 求 n的阶乘

    def chengji(n): if n == 0: return 1 return chengji(n-1)*nprint(chengji(n))

  3. (笔记) RealTimeRender[实时渲染] C3

    @author: 白袍小道 转载表明,查看随缘 前言: 从历史上看,图形加速始于每个像素扫描线上的插值颜色重叠一个三角形,然后显示这些值.包括访问图像数据允许纹理应用于表面.添加硬件 插入和测试z深度 ...

  4. 1043 Is It a Binary Search Tree (25 分)(二叉查找树)

    #include<bits/stdc++.h> using namespace std; typedef struct node; typedef node *tree; struct n ...

  5. JavaWeb笔记(八)JQuery

    三个版本 1.x:兼容 ie678,使用最为广泛的,官方只做BUG维护, 功能不再新增.因此一般项目来说,使用1.x版本就可以了 最终版本:1.12.4 2.x:不兼容ie678,很少有人使用,官方只 ...

  6. SQLEXPRESS 2012 安装NorthWind和Pub数据库

    安装SQL后,学习时总是没有这两个示例数据库. 先从微软那里下载此文件. 网址:http://www.microsoft.com/en-us/download/details.aspx?id=2365 ...

  7. c# json 反序列化 泛型List 2行代码

    List<EncyTable> list = new List<EncyTable>(); var jsonReqeust = "[{ENCY_ID:775,ENCY ...

  8. 29个android开发常用的类、方法及接口

    在安卓开发中,我们常常都需要借助各种各样的方法.类和接口来实现相关功能.提升开发效率,但对于初学者而言,什么时候该用什么类.方法和接口呢?下面小编整理了29个,日常开发中比较常用的类.方法.接口及其应 ...

  9. hdu 1007 Quoit Design (最近点对问题)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. spring in action 学习十二:property placeholder 注解的方式实现避免注入外部属性硬代码化

    这里的注解是指@PropertySource这个注解.用@PropertySource这个注解加载.properties文件. 案例的目录结构如下: student.properties的代码如下: ...