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]表示不炸的行的数量。

然后每个状态取最优。

 #include <bits/stdc++.h>
using namespace std;
#define N 25
char s[];
bitset<N> f[N], dp[<<N];
int id[<<N], num[<<N]; int lowbit(int x) { return x & -x; } int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for(int i = ; i < n; i++) {
scanf("%s", s);
for(int j = ; j < m; j++) {
f[i][j] = s[j] == '*';
}
}
for(int i = ; i < N; i++)
id[<<i] = i;
int ans = max(n, m);
for(int i = ; i < ( << n); i++) { // 状态i某一位是1表示这一位的行不炸
dp[i] = dp[i-lowbit(i)] | f[id[lowbit(i)]]; // 状态i表示行的状态,1表示有'*',dp[i]表示没炸的行有多少列是需要炸的
num[i] = num[i-lowbit(i)] + ; // 表示第i个状态不需要炸的行的数量
ans = min(ans, max(n - num[i], (int)dp[i].count()));
// n - num[i] 表示炸多少行, dp[i].count()表示炸多少列
}
printf("%d\n", ans);
return ;
}

最新文章

  1. python常用模块json、os、sys
  2. js基础练习二之简易日历
  3. Java基础学习 -- Java(OOP)程序的设计原则
  4. @ModelAttribute运用详解
  5. Android中实现自定义的拍照应用
  6. 新浪微博客户端(17)-集成MJExtension
  7. 简单选择排序(Simple Selection Sort)的C语言实现
  8. Dispatcher &amp; Redirect
  9. 网站开发进阶(三十四)编码中的setCharacterEncoding 理解
  10. java abs(绝对值) , max(最大值),min(最小值) 方法的应用
  11. JavaScript03-基本概念一
  12. 重写Java中包装类的方法
  13. Create Extraction Zone
  14. tensorflow实现循环神经网络
  15. spring boot springmvc视图
  16. Android SimpleAdapter的参数
  17. [python] python单元测试经验总结
  18. python学习之【16】网络编程
  19. LINUX监控一:监控命令
  20. 《python编程从入门到实践》第六章笔记

热门文章

  1. EF延迟加载LazyLoading
  2. jquery 用json设置css
  3. WPF控件的一些特殊应用
  4. 用MVVM模式开发中遇到的零散问题总结(2)
  5. MVC linq执行顺序
  6. Selenium-简介
  7. 【转】Powerdesigner逆向工程从sql server数据库生成pdm
  8. WPF svg 转 xmal
  9. Docker笔记02-日志平台ELK搭建
  10. 网易Lofter