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 ;
}

Codeforces Gym101246C:Explode 'Em All(DP + bitset)的更多相关文章

  1. CodeForces - 1093F:Vasya and Array (DP&计数)

    题意:N,K,L,以及给定长度为N的序列,表示其对应的颜色,-1表示还没有涂色,现在让你去涂色,使得最后没有大于等于L的连续的同色的情况. 思路:我们用dp[i][j]表示第i个位置颜色为j的合法方案 ...

  2. Codeforces 733C:Epidemic in Monstropolis(暴力贪心)

    http://codeforces.com/problemset/problem/733/C 题意:给出一个序列的怪兽体积 ai,怪兽只能吃相邻的怪兽,并且只有体积严格大于相邻的怪兽才能吃,吃完之后, ...

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

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

  4. CodeForces - 115E:Linear Kingdom Races (DP+线段树+lazy)

    pro: 从左到有有N个车道,都有一定程度损坏,所以有不同的修理费a[]: 有M场比赛,每场比赛的场地是[Li,Ri],即如果这个区间的车道都被修理好,则可以举办这个比赛,并且收益是Pi.问最多得到多 ...

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

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

  6. Codeforces 580B: Kefa and Company(前缀和)

    http://codeforces.com/problemset/problem/580/B 题意:Kefa有n个朋友,要和这n个朋友中的一些出去,这些朋友有一些钱,并且和Kefa有一定的友谊值,要求 ...

  7. Codeforces 776D:The Door Problem(DFS染色)

    http://codeforces.com/problemset/problem/776/D 题意:有n个门,m个开关,每个门有一个当前的状态(0表示关闭,1表示打开),每个开关控制k个门,但是每个门 ...

  8. Codeforces 755B:PolandBall and Game(map+思维)

    http://codeforces.com/problemset/problem/755/B 题意:A可以喊出n个字符串,B可以喊出m个字符串,如果一个字符串之前被喊过,那么它再也不能喊了,A先喊,最 ...

  9. Codeforces 777D:Cloud of Hashtags(水题)

    http://codeforces.com/problemset/problem/777/D 题意:给出n道字符串,删除最少的字符使得s[i] <= s[i+1]. 思路:感觉比C水好多啊,大概 ...

随机推荐

  1. intel dpdk IPv4 Fragmentation Sample Application 测试

    在上一篇文章中testpmd根据该方案已经在的情况下试验成功,来examples/ipvr_frag夹. 确认环境变量RTE_SDK.RTE_TARGET行.跑make. 一.一个逻辑核(lcore) ...

  2. .NET 上传并解析CSV文件存库

    1.前端: 放置浏览按钮 <div class="row inner_table text-center"> <input id="fileId&quo ...

  3. Shell脚本入门学习笔记

    1.shell操作系统和用户之间.负责解释命令行 2./etc/shells 记录登录系统有效支持shell 3./etc/passwd 最后,有人谁可以看到用户的默认shell 4.直接输入shel ...

  4. boost库asio详解8——几个TCP的简单例子

    摘于boost官网的几个例子, 做了点小修改, 笔记之. 同步客户端 void test_asio_synclient() { typedef boost::asio::io_service IoSe ...

  5. main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。

    读到这里,大家应该了解了main函数返回值的来龙去脉了.下面介绍一下main函数返回值的作用以及如何获得这个返回值.main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出.返回其它 ...

  6. 动态lambda 构建

    var param = Expression.Parameter(typeof(T)); var datetime1 = Expression.Constant(dt1); var datetime2 ...

  7. GlusterFS集群文件系统研究(负载均衡的最常用办法) good

    http://blog.csdn.net/liuaigui/article/details/6284551 http://blog.csdn.net/liuaigui/article/details/ ...

  8. Delphi 10.2 非官方补丁合集

    Delphi 10.2 非官方补丁合集http://blog.qdac.cc/?p=4485 FMXObject和TFORM的释放都变成异步了.虽然能保证是在主线程中释放,但是Windows部分的线程 ...

  9. 一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)

    Qt 中没有专门显示图片的控件,通常我们会使用QLabel来显示图片.但是QLabel 显示图片的能力还是有点弱.比如不支持图像的缩放一类的功能,使用起来不是很方便.因此我就自己写了个简单的类. 我这 ...

  10. C函数实现返回多个值的方法

    C语言中,一个函数最多只能实现一个返回值. int func (int b) { int a=5; if (a>b) return a; else return b; return  0; } ...