题目链接: POJ 3345 Bribing FIPA

题意:

一个国家要参加一个国际组织,  需要n个国家投票,  n个国家中有控制和被控制的关系, 形成了一颗树.

比如: 国家C被国家B控制, 国家B被国家A控制, 那么B , C 会跟着A投同一家国家. 而要有些国家给它投票,

就得用若干钻石去贿赂那些国家. 最后问, 要到至少有m个国家投它的票, 最少需要多少钻石.

分析: 对于每一个结点只有两种状态, 选与不选, 所以dp方程里加上一维即可.

dp[i][j][k], 表示在i的子结点中,选j个最少需要的钻石数, 另k=1表示选i本身,k=0表示不选

dp[cnt][j+k][0] = min( dp[cnt][j+k][0], dp[cnt][j][0] + min(dp[son][k][0],dp[son][k][1]) );

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<map>
using namespace std;
const int inf=0xFFFFFFF;
vector<string>N[205];
vector<int>M[205];
map<string,int>Map;
int h[205],dp[205][205][2]; /// dp[i][j][k] k=0表示不选i,反之则选
int n,m;
void Init(){
for(int i=0;i<=n;++i){
N[i].clear();
M[i].clear();
for(int j=0;j<=n;++j)
dp[i][j][1]=dp[i][j][0]=inf;
}
memset(h,0,sizeof(h));
}
void DFS(int cnt){
int len=M[cnt].size();
h[cnt]=len;
for(int i=0;i<len;++i)
DFS(M[cnt][i]),h[cnt]+=h[M[cnt][i]];
for(int i=2;i<=min(m,h[cnt])+1;++i)
dp[cnt][i][1]=dp[cnt][1][1]; ///贿赂了cnt,就不用贿赂它的子结点
dp[cnt][0][0]=0;
for(int i=0;i<len;++i){
int son=M[cnt][i];
for(int j=m; j>=0; --j)
for(int k=m-j; k>=0; --k)
dp[cnt][j+k][0]=min(dp[cnt][j+k][0],dp[cnt][j][0]+min(dp[son][k][0],dp[son][k][1]));
}
}
int main(){
while(cin>>n>>m){
Init();
for(int i=1;i<=n;++i){
string s; cin>>s>>dp[i][1][1];
Map[s]=i;
char c; scanf("%c",&c);
while(c!='\n'){
cin>>s;
N[i].push_back(s);
scanf("%c",&c);
}
}
for(int i=1;i<=n;++i){
int len=N[i].size();
for(int j=0;j<len;++j){
string s=N[i][j];
M[i].push_back(Map[s]);
h[Map[s]]=1;
}
}
for(int i=1;i<=n;++i)
if(h[i]==0) M[0].push_back(i);
memset(h,0,sizeof(h));
DFS(0);
cout<<min(dp[0][m][1],dp[0][m][0])<<endl;
}
return 0;
} /* 7 3
A 7 B C
B 5 D E
C 6 F G
D 1
E 2
F 3
G 4 5
*/

POJ 3345 Bribing FIPA 树形DP的更多相关文章

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

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

  2. [POJ 3345] Bribing FIPA

    [题目链接] http://poj.org/problem?id=3345 [算法] 树形背包 [代码] #include <algorithm> #include <bitset& ...

  3. poj 2324 Anniversary party(树形DP)

    /*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...

  4. POJ 3162.Walking Race 树形dp 树的直径

    Walking Race Time Limit: 10000MS   Memory Limit: 131072K Total Submissions: 4123   Accepted: 1029 Ca ...

  5. POJ 1655.Balancing Act 树形dp 树的重心

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14550   Accepted: 6173 De ...

  6. POJ 2342 - Anniversary party - [树形DP]

    题目链接:http://poj.org/problem?id=2342 Description There is going to be a party to celebrate the 80-th ...

  7. POJ - 3162 Walking Race 树形dp 单调队列

    POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...

  8. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

  9. POJ 3162 Walking Race 树形DP+线段树

    给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...

随机推荐

  1. java利用16进制来辨别png格式的图片

    很多人知道利用.png的字符串结尾可以判断前端传入的图片是否为png格式,但是这只是潜意识的判断!那么如何利用png读写的特殊内容来深意识地判断图片格式呢?最近在做东西的时候遇到了点问题,在加载图片的 ...

  2. 建立一个名叫Cat的类

    //属性 成员变量 String name; int age; String color; //方法 函数 成员函数 void name() { System.out.println("名字 ...

  3. 如何在安装程序中判断操作系统是否是64位 inno

    [Setup]; 开启64位模式ArchitecturesInstallIn64BitMode=x64 [Run] ;根据是否是64位进行不同的操作Filename: "..."; ...

  4. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  5. ios开发FMDB导入SQLCipher加密数据库

    转:http://www.2cto.com/kf/201407/315727.html [iOS]FMDB/SQLCipher数据库加解密,迁移

  6. Ceph monitor故障恢复探讨

    1 问题 一般来说,在实际运行中,ceph monitor的个数是2n+1(n>=0)个,在线上至少3个,只要正常的节点数>=n+1,ceph的paxos算法能保证系统的正常运行.所以,对 ...

  7. JAVA自已设计JSON解析器

    当然,有很多很好的JSON解析的JAR包,比如JSONOBJECT,GSON,甚至也有为我们测试人员而打造的JSONPATH,但我还是自已实现了一下(之前也实现过,现在属于重构). 思想是这样的,以这 ...

  8. Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换

    已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

  9. android桌面快捷方式跳转到指定activity

    AndroidManifest.xml 应用主入口配置: <activity android:name="com.*.cust.contacts.MainActivity" ...

  10. C#后台弹出对话框

    Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script language='jav ...