http://poj.org/problem?id=1185
Description
Input
Output
Sample Input
5 4 PHPP PPHH PPPP PHPP PHHP
Sample Output
6
S
解题思路: http://chuanwang66.iteye.com/blog/1467227#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N=105; int sum[N],n,m,mp[105],dp[105][N][N],s[N],k; char a[N][12]; bool ok(int x) { if(x&(x<<1))return false; if(x&(x<<2))return false; return true; } int get_sum(int x) { int sum=0; while(x) { if(x&1) sum++; x>>=1; } return sum; } void init() { k=0; memset(s,0,sizeof(s)); for(int i=0;i<(1<<m);i++) if(ok(i)) { s[k]=i; sum[k++]=get_sum(i); } } int main() { while(~scanf("%d%d",&n,&m)) { memset(dp,-1,sizeof(dp)); for(int i=0;i<n;i++) scanf("\n%s",a[i]); for(int i=0;i<n;i++) { mp[i]=0; for(int j=0;j<m;j++) if(a[i][j]=='H') mp[i]|=(1<<j); } init(); for(int i=0;i<k;i++) if(!(s[i]&mp[0])) dp[0][i][0]=sum[i]; for(int r=1;r<n;r++) { for(int i=0;i<k;i++) { if(mp[r]&s[i])continue; for(int p=0;p<k;p++) { if(s[i]&s[p])continue; for(int q=0;q<k;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(int i=0;i<k;i++) for(int j=0;j<k;j++) ans=max(ans,dp[n-1][i][j]); printf("%d\n",ans); } return 0; }