博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3345 Bribing FIPA 树形DP
阅读量:6836 次
发布时间:2019-06-26

本文共 1204 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

         一个国家要参加一个国际组织,  需要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
#include
#include
#include
#include
#include
using namespace std;const int inf=0xFFFFFFF;vector
N[205];vector
M[205];map
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
=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

 

 

转载地址:http://armkl.baihongyu.com/

你可能感兴趣的文章
一种计算e的方法
查看>>
与Jquery Mobile的第一次亲密接触
查看>>
Windows 8实例教程系列 - 开篇
查看>>
C# 多重overide
查看>>
安装arcgis server 10.2遇到的问题总结
查看>>
查看他人数据接口的安全校验机制
查看>>
react 通过 classnames 处理 多个class 的问题
查看>>
倒计时原理
查看>>
让ul中的li居中显示
查看>>
区分super和this
查看>>
最近工作
查看>>
XJOI网上同步训练DAY2 T2
查看>>
Codeforces 509F Progress Monitoring
查看>>
spring cloud: eureka搭建
查看>>
导弹拦截
查看>>
两个被广泛使用的Model Checking工具
查看>>
BZOJ 4999 This Problem Is Too Simple!
查看>>
[HDU]3555Bomb
查看>>
论语之里仁第四
查看>>
html优化
查看>>