POJ 1185 炮兵阵地 最2的错误出现了

来源:互联网 发布:mac如何下载美服lol 编辑:程序博客网 时间:2024/05/22 04:59

知道什么是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;}

原创粉丝点击