POJ3345 Bribing FIPA(树形DP)
题目大意:
一个国家想贿赂至少m个国家,给出贿赂每个国家需要的钱及他们的附属关系。如果贿赂了主国,其附属国家也同样视为被贿赂了,且保证关系网没环,和一个国家最多只能被一个国家控制。
题目思路:本题要用到树形背包和字符串处理,字符串用普通方法读入特别麻烦且代码繁琐。这里我第一次用到了map:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<map>
using namespace std;
map<string,int>a;//定义map(下标为字符串方便操作)
int u[205],f[205],m[205][205],d[205][205],n,o,t[205];
char h[205],r[205];
int dfs(int x){//深搜int i,j,k;int ans=1;if(x==0)ans=0;if(u[x]==1&&x>0){d[x][0]=0;d[x][1]=f[x];return 1;}for(i=1;i<=n;i++)if(m[x][i]==0)ans+=dfs(i);//将结果相加d[x][0]=0;for(i=1;i<=n;i++){if(m[x][i]==-1) continue; for(k=n;k>=0;k--)//背包for(j=1;j<=k;j++){if(d[x][k-j]!=-1&& d[i][j]!=-1){if(d[x][k]!=-1)d[x][k]=min(d[x][k],d[x][k-j]+d[i][j]);else d[x][k]=d[x][k-j]+d[i][j];}}} if(d[x][ans]==-1||d[x][ans]>f[x])d[x][ans]=f[x]; return ans;
}
int lily(){//因为有可能是'#'所以字符读入char c=getchar();int s=0;while(c<'0'||c>'9') { if(c=='#')return 0; //当为'#'时返回'0';c=getchar(); } while(c>='0'&&c<='9') { s*=10; s+=c-'0'; c=getchar(); } return s;
}
int main(void){int i,j,k,g;char c;while(1){n=lily();//读入nif(n==0)break;//当n为'0'结束scanf("%d",&o);memset(m,-1,sizeof(m));memset(t,0,sizeof(t));getchar();k=1;for(i=1;i<=n;i++){//记录scanf("%s",h);scanf("%d",&g);if(!a[h])a[h]=k++;f[a[h]]=g;u[a[h]]=1;c=getchar();while(c!='\n'){scanf("%s",r);if(!a[r]){a[r]=k++;}m[a[h]][a[r]]=0;t[a[r]]++;u[a[h]]++;c=getchar();}}f[0]=0;u[0]=1;for(i=1;i<=n;i++){if(t[i]==0){m[0][i]=0;u[0]++;f[0]+=f[i];}}memset(d,-1,sizeof(d)); //清空dfs(0);//搜索int max=10000000;for(j=o;j<=n;j++){if(d[0][j]!=-1 &&d[0][j]<max){max=d[0][j];} } printf("%d\n",max);//输出a.clear();//清空}return 0;
}
POJ3345 Bribing FIPA(树形DP)相关推荐
- POJ3345 Bribing FIPA 【背包类树形dp】
题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- [NC15748]旅游 树形dp基础
菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
- 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings
题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...
- 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)
题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...
- 树形dp ---- 2018年杭电多校第二场 H travel
题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...
最新文章
- 深度理解目标检测(MMdetection)-HOOK机制
- JavaEE(1) - Weblogic 服务器管理的数据源
- 学python需要安装什么-初学 Python 需要安装哪些软件?
- LinkedHashMap
- ofstream写不进txt文件的奇怪问题
- gdb调试fork多进程
- Mac VSCode配置C语言环境(可以调试)
- 骑车与走路(信息学奥赛一本通-T1050)
- Python3.x Numpy中的array数组_矩阵操作
- Windows Server AppFabric缓存参考实例和方案选择 2/3
- Object中的clone方法
- ArcGIS API For JavaScript - 地图常用函数方法
- c语言的实验,c语言 实验1
- 寻找春天nbsp;九宫格日记-2011.11.29
- 微软官方地址下载sql 2000简体中文企业版(含SP3 SP4 下载地址)
- android webview浏览器下载文件,Android 浏览器 —— 使用 WebView 实现文件下载
- vue中对鼠标划过事件处理方式
- 树莓派RaspberryPi Zero W 快速安装tips
- 【沧小海笔记】之基于FPGA的以太网设计相关知识——第一章 互联网概述
- uniapp插件市场-涂图视频编辑-美妆-剪辑-微整形原生sdk插件发布-优雅草科技