1. 程式人生 > >小W與氣球

小W與氣球

在這裡插入圖片描述 在這裡插入圖片描述 可以設f[i]為f[i] 行覆蓋情況為 i 時列的覆蓋情況 f[i]=f[i^lowbit]|a[g[lowbit]]; 這裡的lowbiw表示i&-i 個人評價:思考難度提高-       程式碼難度普及-

#include<bits/stdc++.h>
using namespace std;
const int maxn=25,maxm=(1<<20)+5;
int T,n,m,cnt[maxm],a[maxn],f[maxm],g[maxm];
char s[maxn][maxn];
void init()
{
 for(int i=0;i<(1<<
20);++i) cnt[i]=cnt[i/2]+(i&1); for(int i=1;i<=20;++i) g[1<<(i-1)]=i; } int main() { init(); for(scanf("%d",&T);T--;) { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { scanf("%s",s[i]+1); a[i]=0; for(int j=1;j<=m;++j) { if(s[i][j]=='*') a[
i]|=1<<(j-1); } } f[0]=0; int msk=(1<<n)-1; for(int i=1;i<=msk;++i) { int lowbit=i&-i; f[i]=f[i^lowbit]|a[g[lowbit]]; } int ans=1<<30; for(int i=0;i<=msk;++i) { ans=min(ans,max(cnt[f[i]],cnt[msk^i])); } printf("%d\n",ans); } return 0; }

來源:zr