题目链接:http://poj.org/problem?id=1085
状态压缩DP,用二进制的0、1来进行状态存储。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 128
int legal[M],ns;
int map[M];
char tmp[16];
int dp[128][M][M];
int bits[M];
bool Legal(int x)
{
if(x&(x<<2)) return false;
if(x&(x<<1)) return false;
return true;
}
int Bits(int x)
{
int r=0;
while(x){
r++;
x-=x&(-x);
}
return r;
}
int main()
{
int n,m;
int i,j,k,l;
while(~scanf("%d%d",&n,&m)){
for(i=0;i<n;i++){
scanf("%s",tmp);
map[i]=0;
for(j=0;tmp[j];j++){
if(tmp[j]=='H')
map[i]|=1<<j;
}
}
for(i=0,ns=0;i<(1<<m);i++){
if(Legal(i))
legal[ns++]=i;
}
memset(dp,0,sizeof(dp));
for(i=0;i<ns;i++){
if(!(legal[i]&map[0]))
dp[1][0][i]=bits[legal[i]]=Bits(legal[i]);
else bits[legal[i]]=Bits(legal[i]);
}
for(l=2;l<=n;l++){
for(i=0;i<ns;i++){
if(legal[i]&map[l-1])
continue;
for(j=0;j<ns;j++){
if(legal[i]&legal[j])
continue;
for(k=0;k<ns;k++){
if(legal[k]&legal[j]||legal[k]&legal[i])
continue;
if(dp[l][k][i]<dp[l-1][j][k]+bits[legal[i]])
dp[l][k][i]=dp[l-1][j][k]+bits[legal[i]];
}
}
}
}
m=0;
for(i=0;i<ns;i++){
for(j=0;j<ns;j++){
if(dp[n][i][j]>m)
m=dp[n][i][j];
}
}
printf("%d\n",m);
}
return 0;
}