poj_1185状压dp
用二维数组写了好久,失败啊。。
#include<iostream> #include<string.h> #include<cstdio> #include<algorithm> using namespace std; int n,m; int dp[110][110][110]; char st[110][12]; int s[110],an[110],as[110]; int convert(int n) { int cnt=0; while(n>0) { if(n%2)cnt++; n/=2; } return cnt; } int main() { int cnt=0; memset(s,0,sizeof(s)); for(int i=0;i<=(1<<10);i++) { if(!(i&(i<<1))) if(!(i&(i<<2))) {as[cnt]=i;s[cnt]=convert(i);cnt++;} } while(cin>>n>>m) { int nallstatus=2<<(m-1); memset(dp,-1,sizeof(dp)); memset(st,'\0',sizeof(st)); memset(an,0,sizeof(an)); for(int i=0; i<n; i++) scanf("%s",st[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(st[i][j]=='H') an[i]|=(1<<j); for(int j=0; as[j]<nallstatus; j++) { if(!(as[j]&an[0])) {dp[0][0][j]=s[j]; } } for(int i=1;i<n;i++) for(int j=0;as[j]<nallstatus;j++) for(int k=0;as[k]<nallstatus;k++) for(int l=0;as[l]<nallstatus;l++) { int state=1; if(as[j]&an[i]) state=0; if(as[j]&as[k]) state=0; if(as[j]&as[l]) state=0; if(as[k]&as[l]) state=0; if(as[k]&an[i-1]) state=0; if(as[l]&an[i-2]) state=0; if(state) { dp[i][k][j]=max(dp[i][k][j],dp[i-1][l][k]+s[j]); /*if(i==3&&as[j]==4) { cout<<s[k]<<s[j]<<dp[i-2][as[l]]<<dp[i][as[j]]<<endl; cout<<as[k]<<as[l]<<endl; }*/ } } /*for(int i=0;i<n;i++) { for(int j=0;as[j]<nallstatus;j++) cout<<dp[i][as[j]]; cout<<endl; }*/ /*for(int i=0;as[i]<nallstatus;i++) cout<<dp[0][as[i]]<<as[i]<<endl;*/ int cur=0; for(int i=0;as[i]<nallstatus;i++) for (int j=0;as[j]<nallstatus;j++) cur=max(cur,dp[n-1][i][j]); cout<<cur<<endl; } return 0; }