Codeforces Gym101246C:Explode 'Em All(DP + bitset)
http://codeforces.com/gym/101246/problem/C
题意:给出一个n*m的图,“*”表示这个地方需要炸掉,炸弹可以如果丢在(i,j)位置的话,那么可以炸掉第i行第j列的所有“*”。问最少需要丢多少个炸弹可以使得所有“*”被炸掉。
思路:一看就以为是个最小顶点覆盖。然后发现做不了。。。
枚举行的状态i,1表示这一行不炸,0表示炸了这一行。
然后递推。
这里用bitset维护行的状态。
f[i][j]表示第i行j列是否有“*”。
dp[i]表示不炸的行状态有哪些列是需要炸的。
num[i]表示不炸的行的数量。
然后每个状态取最优。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define N 25 4 char s[26]; 5 bitset<N> f[N], dp[1<<N]; 6 int id[1<<N], num[1<<N]; 7 8 int lowbit(int x) { return x & -x; } 9 10 int main() { 11 freopen("input.txt", "r", stdin); 12 freopen("output.txt", "w", stdout); 13 int n, m; 14 scanf("%d%d", &n, &m); 15 for(int i = 0; i < n; i++) { 16 scanf("%s", s); 17 for(int j = 0; j < m; j++) { 18 f[i][j] = s[j] == '*'; 19 } 20 } 21 for(int i = 0; i < N; i++) 22 id[1<<i] = i; 23 int ans = max(n, m); 24 for(int i = 1; i < (1 << n); i++) { // 状态i某一位是1表示这一位的行不炸 25 dp[i] = dp[i-lowbit(i)] | f[id[lowbit(i)]]; // 状态i表示行的状态,1表示有'*',dp[i]表示没炸的行有多少列是需要炸的 26 num[i] = num[i-lowbit(i)] + 1; // 表示第i个状态不需要炸的行的数量 27 ans = min(ans, max(n - num[i], (int)dp[i].count())); 28 // n - num[i] 表示炸多少行, dp[i].count()表示炸多少列 29 } 30 printf("%d\n", ans); 31 return 0; 32 }
转载于:https://www.cnblogs.com/fightfordream/p/6500610.html
Codeforces Gym101246C:Explode 'Em All(DP + bitset)相关推荐
- 洛谷 P1164:小A点菜(DP/DFS)
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...
- codeforces 361 D. Levko and Array(dp+二分)
题目链接:http://codeforces.com/contest/361/problem/D 题意:最多可以修改K次数字,每次修改一个数字变成任意值,C=max(a[i+1]-a[i]):求操作之 ...
- Codeforces Gym101518H:No Smoking, Please(最小割)
题目链接 题意 给出一个n*m的酒店,每个点是一个房间,要将这个酒店的房间划分成为两块(一块无烟区,一块吸烟区),相邻的两个房间之间有一条带权边,权值代表空气锁的面积,如果把这条边给去掉,那么需要花费 ...
- CodeForces 285 E.Positions in Permutations(dp+组合数学)
Description 定义一个排列的权为满足|pi−i|=1|p_i-i|=1的ii的个数,问长度为nn的排列且权为kk的有多少个 Input 两个整数n,k(1≤n≤1000,0≤k≤n)n,k( ...
- CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)
CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 机器学习中的数学——距离定义(十三):杰卡德距离(Jaccard Distance)和杰卡德相似系数(Jaccard Similarity Coefficient)
分类目录:<机器学习中的数学>总目录 相关文章: · 距离定义:基础知识 · 距离定义(一):欧几里得距离(Euclidean Distance) · 距离定义(二):曼哈顿距离(Manh ...
- 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1
之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...
- 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-7.分类的模型关联和通用CRUD接口
技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-7.分类的模型关联和通用CRUD接口 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-1.工具和 ...
最新文章
- Windows10为什么自带Linux,一直没有发现原来 Win10 内置了一个 Linux
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
- Java三大主流开源工作流引擎技术分析
- python中文文本分析_python--文本分析
- leetcode203.移除链表元素
- SQL Server 2005 在只有MDF文件的情况下恢复(丢失日志文件)
- 9-5:C++多态之多态和继承的经典题目以及面试中常考内容
- ShadeGraph教程之节点详解3:Input Nodes
- rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区
- python中线程里面多线程_Python中的线程和多线程是什么
- centos7开启网卡命令_centos7如何启动网卡
- 获取QQ好友列表接口分析
- 多项式承诺Polynomial commitment方案汇总
- 几乎所有食物的英文翻译
- 【PPT】PPT倒计时动画的制作方法 5.4.3.2.1...
- 【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?
- 数据中心解决方案之灾备方案设计(上)
- 个人网站搭建之服务器环境搭建
- 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作
- 计算机发展15件重大事件(图说)
热门文章
- 使用NSRunloop等待异步任务完成
- 对文本框只允许输入数字
- vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素
- 计算机公共课考试试题,2019-度公共课计算机应用基础考试试题附答案.doc
- php imagick icon,php Imagick 生成图片
- java中将json字符串_Java中JSON字符串与java对象的互换实例详解
- java 图像膨胀与腐蚀程序_膨胀和腐蚀 - 解决图像缺陷问题
- 虚拟机无法连接以太网
- java win8 mac地址_Win8怎么查看MAC地址_Win8查看电脑MAC地址方法-192路由网
- wxpython 内嵌字体_【wxPython】wx.font类字体