知道什么是1 ,什么是0.
题意:求一个棋盘中最多可以放几个十字(十字尺寸一定,宽度为一格)。
做法:压缩一下就可以了,较水,只是,2了一下。。。。
#include<stdio.h>
#include<string.h>
int dp[105][65][65];
int state[65],get[65],blo[105];
int n,m,all,ret;
inline int max(int a,int b)
{
return a>b?a:b;
}
void dfs(int lie,int s)
{
if(lie>=m)
{
for(int i=0;i<lie;i++)
if(1<<i&s)get[all]++;
state[all++]=s;
return ;
}
dfs(lie+1,s);
dfs(lie+3,s|1<<lie);//应该是加3!!!T_T
}
int main()
{
int i,j,k,t,ans;
char clo[15];
while(scanf("%d%d",&n,&m)!=EOF)
{
all=0;
memset(blo,0,sizeof(blo));
memset(dp,-1,sizeof(dp));
memset(get,0,sizeof(get));
ret=-1;
dfs(0,0);
for(i=1;i<=n;i++)
{
scanf("%s",clo);
for(j=0;j<m;j++)
if(clo[j]=='H')
blo[i]=blo[i]|1<<j;
}
for(i=0;i<all;i++)
if((blo[1]&state[i])==0)
dp[1][0][i]=get[i];
if(n>1)
{
for(i=2;i<=n;i++)
for(j=0;j<all;j++)
if((blo[i]&state[j])==0)
for(k=0;k<all;k++)
if((state[j]&state[k])==0)
for(t=0;t<all;t++)
if((state[t]&state[k])==0&&(state[t]&state[j])==0)
dp[i][k][j]=max(dp[i][k][j],dp[i-1][t][k]+get[j]);
}
ans=0;
for(i=0;i<all;i++)
for(j=0;j<all;j++)
ans=max(ans,dp[n][i][j]);
printf("%d\n",ans);
}
return 0;
}