2~9????

P2704 [NOI2001] 炮兵阵地

zhaomingrui @ 2018-11-01 16:03:35

哪里错了?

#include<bits/stdc++.h>
using namespace std;
struct sd{
    int data,num;
}in[15][2050];
int n,m,two[15],cnt,sum[15][100],dp[205][205][205],inv[105],max_ans;
char s[105][15];
bool check(int x)
{
    if(!(x&(x<<1))&&!(x&(x<<2))&&!(x&(x>>1))&&!(x&(x>>2))) return true;
    else return false;
}
void build(int x,int now,int y,int tot)
{
    if(now==m)
    {
        if(check(x))
        {
         in[y][++cnt].num=x;
         in[y][cnt].data=tot;
         //printf("%d %d\n",x,tot);
        }
        return;
    }
    else
    {
      if(s[y][now+1]=='P') build(x+two[now],now+1,y,tot+1);
      build(x,now+1,y,tot);
    }
    return;
}
inline void pre_work()
{
   two[0]=1;
   for(int i=1;i<=20;++i) two[i]=two[i-1]*2;
    for(int i=1;i<=n;++i)
    {
     cnt=0;
     build(0,0,i,0);
     inv[i]=cnt;
    }
    for(int i=1;i<=inv[1];++i)
     for(int j=1;j<=inv[2];++j)
      if(!(in[1][i].num&in[2][j].num))
        dp[2][j][i]=in[1][i].data+in[2][j].data;
}
int main()
{
    memset(dp,0,sizeof(dp));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
     scanf("%s",s[i]+1);
     pre_work();
    for(int i=3;i<=n;++i)
     for(int j=1;j<=inv[i];++j)
      for(int h=1;h<=inv[i-1];++h)
        for(int k=1;k<=inv[i-2];++k)
         {
            if(!(in[i][j].num&in[i][h].num)&&!(in[i][k].num&in[i][j].num)&&!(in[i][h].num&in[i][k].num))
            dp[i][j][h]=max(dp[i-1][h][k]+in[i][j].data,dp[i][j][h]);
         }
         max_ans=0;
  for(int i=1;i<=inv[n-1];++i)
   for(int j=1;j<=inv[n];++j)
     max_ans=max(max_ans,dp[n][j][i]);
     printf("%d",max_ans);
      return 0;
}

|