网上搜的题解除了暴搜就是二分图匹配 我试了下用状态压缩做做。。。比较乱来
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char map[5][5];
int n, num;
int sta[5][21], the[5][21], l[5], dp[5][21];
void deal(int x)
{
int i, j, tmp, p, q;
bool f, r;
for(i=0; i<num; i++)
{
j=0;
p=i;
f=true;
r=false;
q=0;
while(j<n)
{
tmp=p%2;
if(tmp&&map[x][j]=='X'||tmp&r)
{
f=false;
break;
}
if(tmp) q++;
if(map[x][j]=='X')
r=false;
if(tmp) r=true;
p/=2;
j++;
}
if(f) sta[x][l[x]]=i, the[x][l[x]++]=q;
}
}
int main()
{
int i, j, k, t, q, ns;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
num=1<<n;
for(i=0; i<n; i++)
scanf("%s",map[i]);
memset(l,0,sizeof(l));
for(i=0; i<n; i++)
deal(i);
memset(dp,0,sizeof(dp));
for(i=0; i<l[0]; i++)
dp[0][sta[0][i]]=the[0][i];
int x, y, ans=0;
for(i=1; i<n; i++)
{
for(j=0; j<l[i]; j++)
{
x=sta[i][j];
for(k=0; k<num; k++)
{
if(!(x&k))
{
q=k;
ns=x|k;
t=0;
while(t<n)
{
if(q%2&&map[i][t]=='X')
ns^=1<<t;
t++;
q/=2;
}
dp[i][ns]=max(dp[i][ns],the[i][j]+dp[i-1][k]);
}
}
}
}
for(i=0;i<num;i++)
ans=max(ans,dp[n-1][i]);
printf("%d\n",ans);
}
}