HDU 1045 Fire Net
网上搜的题解除了暴搜就是二分图匹配 我试了下用状态压缩做做。。。比较乱来
#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); } }