标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 26246 | Accepted: 10127 |
Description
Input
Output
Sample Input
5 4 PHPP PPHH PPPP PHPP PHHP
Sample Output
6
Source
每一行的合法放置状态只有60种
f(i,j,k)表示到第i行,前两行的状态为j,k,状压dp。。。
#include<cstdio> #include<iostream> using namespace std; const int N=105; const int M=65; int n,m,top,mx; int bin[20],q[N<<4]; int s[N],f[N][M][M]; char a[N][15]; int cal(int x){ int ans=0; for(int i=0;i<m;i++) if(bin[i]&x) ans++; return ans; } int main(){ bin[0]=1; for(int i=1;i<20;i++) bin[i]=bin[i-1]<<1; scanf("%d%d",&n,&m); for(int i=0;i<bin[m];i++) if((i&(i>>1))==0&&(i&(i>>2))==0) q[++top]=i; for(int i=1;i<=n;i++){ scanf("%s",a[i]+1); for(int j=1;j<=m;j++) if(a[i][j]==‘H‘) s[i]+=bin[j-1]; } for(int i=1;i<=top;i++) if((q[i]&s[1])==0) f[1][i][1]=cal(q[i]); for(int i=1;i<n;i++) for(int j=1;j<=top;j++) for(int k=1;k<=top;k++) if(f[i][j][k]!=-1) for(int x=1;x<=top;x++) if((q[x]&s[i+1])==0) if((q[j]&q[x])==0&&(q[k]&q[x])==0) f[i+1][x][j]=max(f[i+1][x][j],f[i][j][k]+cal(q[x])); for(int j=1;j<=top;j++) for(int k=1;k<=top;k++) mx=max(mx,f[n][j][k]); printf("%d\n",mx); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5929683.html