标签:整数 eof 预处理 分享图片 问题 efi gets 部署 scanf
5 4 PHPP PPHH PPPP PHPP PHHP
6
#include <stdio.h> #include <string.h> #include <iostream> #define MAX(a,b) (a)>(b)?(a):(b) using namespace std; int dp[105][65][65],s[105]; int n,m,cnt,map[105],sum[105]; bool ok(int x) { if(x&(x<<1))return false; if(x&(x<<2))return false; return true; } int getsum(int x) { int num=0; while(x){ if(x&1)num++; x>>=1; }return num; } void find() { memset(s,0,sizeof(s)); for(int i=0;i<(1<<m);i++) {//i枚举所有m位的二进制数 if(ok(i)) { s[cnt]=i; sum[cnt++]=getsum(i); } } } int main() { while(~scanf("%d%d",&n,&m)){ memset(dp,-1,sizeof(dp)); int i; for(i=0;i<n;i++){ for(int j=0;j<m;j++){ char tmp; cin>>tmp; if(tmp==‘H‘)map[i]=map[i]|(1<<j); } } cnt=0; find(); for(i=0;i<cnt;i++) if(!(s[i]&map[0])) dp[0][i][0]=sum[i]; for(int r=1;r<n;r++) { for(int i=0;i<cnt;i++) { if(map[r]&s[i]) continue; for(int p=0;p<cnt;p++) { if(s[i] & s[p]) continue; for(int q=0;q<cnt;q++) { if(s[p] & s[q]) continue; if(s[i] & s[q]) continue; if(dp[r-1][p][q]==-1) continue; dp[r][i][p]=MAX(dp[r][i][p],dp[r-1][p][q]+sum[i]); } } } } int ans=0; for(i=0;i<cnt;i++) for(int j=0;j<cnt;j++) ans=MAX(ans,dp[n-1][i][j]); printf("%d\n",ans); } return 0; }
标签:整数 eof 预处理 分享图片 问题 efi gets 部署 scanf
原文地址:http://www.cnblogs.com/hua-dong/p/7965785.html