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)相关推荐

  1. 洛谷 P1164:小A点菜(DP/DFS)

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...

  2. codeforces 361 D. Levko and Array(dp+二分)

    题目链接:http://codeforces.com/contest/361/problem/D 题意:最多可以修改K次数字,每次修改一个数字变成任意值,C=max(a[i+1]-a[i]):求操作之 ...

  3. Codeforces Gym101518H:No Smoking, Please(最小割)

    题目链接 题意 给出一个n*m的酒店,每个点是一个房间,要将这个酒店的房间划分成为两块(一块无烟区,一块吸烟区),相邻的两个房间之间有一条带权边,权值代表空气锁的面积,如果把这条边给去掉,那么需要花费 ...

  4. 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( ...

  5. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  6. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  7. 机器学习中的数学——距离定义(十三):杰卡德距离(Jaccard Distance)和杰卡德相似系数(Jaccard Similarity Coefficient)

    分类目录:<机器学习中的数学>总目录 相关文章: · 距离定义:基础知识 · 距离定义(一):欧几里得距离(Euclidean Distance) · 距离定义(二):曼哈顿距离(Manh ...

  8. 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1

    之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...

  9. 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-7.分类的模型关联和通用CRUD接口

    技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-7.分类的模型关联和通用CRUD接口 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-1.工具和 ...

最新文章

  1. Windows10为什么自带Linux,一直没有发现原来 Win10 内置了一个 Linux
  2. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
  3. Java三大主流开源工作流引擎技术分析
  4. python中文文本分析_python--文本分析
  5. leetcode203.移除链表元素
  6. SQL Server 2005 在只有MDF文件的情况下恢复(丢失日志文件)
  7. 9-5:C++多态之多态和继承的经典题目以及面试中常考内容
  8. ShadeGraph教程之节点详解3:Input Nodes
  9. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区
  10. python中线程里面多线程_Python中的线程和多线程是什么
  11. centos7开启网卡命令_centos7如何启动网卡
  12. 获取QQ好友列表接口分析
  13. 多项式承诺Polynomial commitment方案汇总
  14. 几乎所有食物的英文翻译
  15. 【PPT】PPT倒计时动画的制作方法 5.4.3.2.1...
  16. 【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?
  17. 数据中心解决方案之灾备方案设计(上)
  18. 个人网站搭建之服务器环境搭建
  19. 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作
  20. 计算机发展15件重大事件(图说)

热门文章

  1. 使用NSRunloop等待异步任务完成
  2. 对文本框只允许输入数字
  3. vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素
  4. 计算机公共课考试试题,2019-度公共课计算机应用基础考试试题附答案.doc
  5. php imagick icon,php Imagick 生成图片
  6. java中将json字符串_Java中JSON字符串与java对象的互换实例详解
  7. java 图像膨胀与腐蚀程序_膨胀和腐蚀 - 解决图像缺陷问题
  8. 虚拟机无法连接以太网
  9. java win8 mac地址_Win8怎么查看MAC地址_Win8查看电脑MAC地址方法-192路由网
  10. wxpython 内嵌字体_【wxPython】wx.font类字体