您的位置:首页 > 其它

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

2012-09-13 21:00 246 查看
知道什么是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
[i][j]);
        printf("%d\n",ans);
    }
      return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: