Bribing FIPA
给出多棵有n个节点的有根树,第i个节点有一个权值\(a_i\),定义一个点能控制的点为其所有的子节点和它自己,询问选出若干个点的最少的权值之和,并且能够控制大于等于m个点,\(1 ≤ n ≤ 200\)
解
此题卡输入,插点题外话
c++语法讲解:
c++11将gets()函数弃用了,而代以更加安全的fgets(),原因为gets的读入为一定要读完一行,而实际上可以读的数据是无限的,而电脑的内存空间是有限的,用无限的数据去填满有限的内存,那是自然会死机的,于是fgets加了一个限制,一定要按你给的字符数组大小读入,自然不支持string。
fgets(char数组名,sizeof(char数组名),stdin)
streamstring是为了方便读入而引入的,比较老的c++版本是不会支持的,但放心的是oi肯定支持(类似一个类型)
用法(建议运行试一试)
参考代码
#include <iostream>
#include <cstdio>
#include <sstream>
using namespace std;
int main(){
char s[1000];
stringstream a;//a为变量名
//读入7 afsfs 0.125
fgets(s,sizeof(s),stdin);
a.clear(),a.str(s);//清空a,用s来填充a
int b;string c;double d;
a>>b,a>>c,a>>d;
cout<<b<<' '<<c<<' '<<d;
return 0;
}
- .clear()
清空状态标志,每次用完stringstream一定要清空,但未释放内存,可以做个小测试,打开内存显示,运行一下下面的程序,等待5s
#include <iostream>
#include <cstdio>
#include <sstream>
using namespace std;
int main(){
register stringstream io;
while(true)io<<"lsy akioi",io.clear();
return 0;
}
- .str()
用字符串s来重置stringstream,释放了内存
- \(>>,<<\)分别表示输入到和输出到
废话完结
回到题目,显然是树形递推,因为是森林,故用一个超级根0连上所有树根,变为一棵树,肯定设两维\(f[i][j]\)表示以i为节点的子树中,控制了j个点的选择权值之和的最小值,显然有
\]
其中l为i的一个子节点,k为其控制的点,也可以用分组背包来理解,i只不过代替不同的背包,j是容量,而子树就是每一组物品,k就是物品,只是压了子树这一维状态,设\(s[x]\)为x的子树中节点个数。
边界:\(f[x][0]=0,f[x][s[x]]=a_x,x=0,1,2,3,...,n\)特别地\(a_0=INT\_MAX\)。
参考代码:
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <sstream>
#define il inline
#define ri register
#define lsytql true
#define intmax 0x7fffffff
using namespace std;
struct point{
int next,to;
}ar[401];
bool check[201];
int c[201],at,head[201],
in[201],dp[201][201],
st[201],mt,n,m;
char s[30000];
stringstream oi;
map<string,int>M;
void dfs(int);
il int min(int,int);
il void link(int,int);
int main(){
while(true){
mt&=0,M.clear(),memset(head,0,sizeof(head)),at&=0;
memset(in,0,sizeof(in)),memset(check,0,sizeof(check));
memset(dp,2,sizeof(dp)),memset(st,0,sizeof(st));
fgets(s,sizeof(s),stdin),oi.clear(),oi.str(s),oi>>n>>m;
if(s[0]=='#')break;for(int i(1),j;i<=n;++i){
fgets(s,sizeof(s),stdin);
oi.clear(),oi.str(s),oi>>s;
if(M.find(s)==M.end())M[s]=++mt;
j=M[s],oi>>c[j];
while(oi>>s){
if(M.find(s)==M.end())M[s]=++mt;
link(j,M[s]),++in[M[s]];
}
}int ans(intmax);
for(int i(1);i<=n;++i)if(!in[i])link(0,i);dfs(0);
for(int i(m);i<=n;++i)if(dp[0][i]<ans)ans=dp[0][i];
printf("%d\n",ans);
}
return 0;
}
il int min(int a,int b){
return a<b?a:b;
}
void dfs(int x){
check[x]|=true,dp[x][0]=0;
for(int i(head[x]);i;i=ar[i].next)
if(!check[ar[i].to]){
dfs(ar[i].to),st[x]+=st[ar[i].to];
for(int j(n),k;j>0;--j)
for(k=1;k<=j;++k)
dp[x][j]=min(dp[x][j],dp[x][j-k]+dp[ar[i].to][k]);
}++st[x],dp[x][st[x]]=min(dp[x][st[x]],c[x]);
}
il void link(int u,int v){
ar[++at].to=v;
ar[at].next=head[u],head[u]=at;
}
Bribing FIPA的更多相关文章
- POJ 3345 Bribing FIPA 树形DP
题目链接: POJ 3345 Bribing FIPA 题意: 一个国家要参加一个国际组织, 需要n个国家投票, n个国家中有控制和被控制的关系, 形成了一颗树. 比如: 国家C被国家B控制, 国 ...
- poj3345 Bribing FIPA【树形DP】【背包】
Bribing FIPA Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5910 Accepted: 1850 Desc ...
- HDU 2415 Bribing FIPA
Bribing FIPA Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...
- POJ3345 Bribing FIPA
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5021 Accepted: 1574 Description There ...
- poj 3345 Bribing FIPA (树形背包dp | 输入坑)
题目链接: poj-3345 hdu-2415 题意 有n个国家,你要获取m个国家的支持,获取第i个国家的支持就要给cost[i]的价钱 其中有一些国家是老大和小弟的关系,也就是说,如果你获 ...
- POJ3345 Bribing FIPA 【背包类树形dp】
题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...
- POJ3345 Bribing FIPA(树形DP)
题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价. 这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP ...
- [POJ 3345] Bribing FIPA
[题目链接] http://poj.org/problem?id=3345 [算法] 树形背包 [代码] #include <algorithm> #include <bitset& ...
- 别人整理的DP大全(转)
动态规划 动态规划 容易: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...
随机推荐
- 将 XML 架构(XSD)附加到Word文档
附加到文档中的 XML 架构是为您的组织进行自定义而设计的.XML 架构通常由 IT 专业人员创建,他们的职责就是在 Word 中为您的组织构建专用的模板或解决方案. 可用于附加到文档的架构在架构库中 ...
- Java中的LinkedList
- vue中的$nextTick的常用思路
Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextT ...
- Vue学习笔记【14】——自定义指令
1.自定义全局和局部(私有)自定义指令 // 自定义全局指令 v-focus,为绑定的元素自动获取焦点: Vue.directive('focus', { inserted: function ...
- PHP FILTER_VALIDATE_INT 过滤器
定义和用法 FILTER_VALIDATE_INT 过滤器把值作为整数来验证. Name: "int" ID-number: 257 可能的选项或标志: min_range - 规 ...
- TxtUtil
/** *包名:cn.yufu.utils *描述:package cn.yufu.utils; */ package cn.yufu.utils; import java.io.BufferedRe ...
- spring之循环依赖问题如何解决
首先,spring是支持循环依赖的.但是循环依赖并不好. 最近,我在使用jenkins自动化部署,测试打出来的jar包,出现了循环依赖的问题. 在这里说一下,我解决问题的过程 我首先根据提示找到循环依 ...
- c#委托(Delegates)--基本概念及使用 转发
在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复.最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用.嗯...本人以前并没有用过,只是稍微知道而已 ...
- 【开发者笔记】Linq 多表关联排序操作
c# 一直是一门好用的语言,但是像linq这种骚操作实在是记不住.特此记下以备后用. var ls = from c in db.T_ProductReturnEntity join s in db. ...
- 5. Jmeter常用快捷键
快捷键 功能 备注 Ctrl + C 复制 可复制组件 Ctrl + V 粘贴 可粘贴组件 Ctrl + Shift + C 复制粘贴当前组件到下一行 Ctrl + R 运行测试计划 Ctrl ...