标签:
/*#include<stdio.h> #include<string.h> #define Max(a,b) a>b?a:b int dp[105][170][170],s[180],sn[180],len; int Count(int m) { int C=0; while(m>0) { if(m&1) C++; m=m>>1; } return C; } int check(int m) { if(m&(m<<2)) return 0; return 1; } void Inint(int m) { len=0; for(int i=0;i<(1<<m);i++) if(check(i)) { s[len]=i; sn[len++]=Count(i); } } int check(int m1,int m2)//检查一个点的四角 { if((m1&(m2<<1))==0&&(m1&(m2>>1))==0)//不能只是左移或者右移,这样可能为超范围造成误判,比如1右移的话变成0就可能会造成误判 return 1; return 0; } int main() { int n,m,Map[105]; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0||m==0) { printf("0\n"); continue; } memset(dp,0,sizeof(dp)); memset(Map,0,sizeof(Map)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { int a; scanf("%d",&a); if(a==0) Map[i]=Map[i]|(1<<(m-j-1)); } Inint(m); for(int i=0;i<len;i++) if((s[i]&Map[0])==0) dp[0][i][0]=sn[i]; for(int i=0;i<len;i++) if((s[i]&Map[1])==0) for(int j=0;j<len;j++) if((Map[0]&s[j])==0&&check(s[i],s[j])) dp[1][i][j]=Max(dp[0][j][0]+sn[i],dp[1][i][j]); for(int r=2;r<n;r++) { for(int i=0;i<len;i++) if((Map[r]&s[i])==0) for(int j=0;j<len;j++) if((Map[r-1]&s[j])==0&&check(s[i],s[j])) for(int k=0;k<len;k++) if((Map[r-2]&s[k])==0&&check(s[i],s[j])&&(s[k]&s[i])==0) dp[r][i][j]=Max(dp[r-1][j][k]+sn[i],dp[r][i][j]); } int ans=0; for(int i=0;i<len;i++) if((Map[n-1]&s[i])==0) for(int j=0;j<len;j++) if((Map[n-2]&s[j])==0&&(s[i]&(s[j]<<1))==0) ans=Max(dp[n-1][i][j],ans); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/u013491149/article/details/43083161