C - Explode ‘Em All( 状压dp )

C - Explode 'Em All( 状压dp )

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 
using namespace std;
#define N 25
char s[26];
bitset f[N], dp[1<

 

你可能感兴趣的:(动态规划补题)