1185炮兵阵地

 

蛋碎的一道题目就就这样通过了啊

其中用了ans来表示地形,0表示平地,

z种可能,其中用flag来表示第i种是否满足左右都没有炮

i&ans表示这种建炮方式是否符合地形,我后面在这里出了问题,结果发现是在建ans时出了问题,因为如果用1来表示平地,这样的话9&(pphh)>0但是如果用0来表示平地的话,9&(pphh)!=0,只有等于0,他才是符合地形的建炮方法

#include "iostream"
#include "algorithm"
using namespace std;
int num[3048],flag[3048],n,m,z,dp[110][1048][1048];
int data[12]={1,2,4,8,16,32,64,128,256,512,1024,2048};
void chushihua(){
  int a;
  for(int i=0;i<z;i++){
    a=0;num[i]=0;
    for(int j=0;j<m;j++){
      if((i&(1<<j))>0){
        if((i&(1<<(j+1)))>0||(i&(1<<(j+2)))>0)a=1;
        num[i]++;
      }
    }
    //if(num[i]==0)num[i]++;
    if(a==1){flag[i]=0;}
    else flag[i]=1;
  }
}
int max(int a,int b){return a>b?a:b;}
int main(){
  char list[12];
  int i,j,k,ans[120],s;
  while(cin>>n>>m){
    for(i=0;i<n;i++){
      cin>>list;ans[i]=0;
      for(j=0;j<m;j++){
        if(list[j]=='H'){ans[i]+=data[j];}
      }
    }
    z=(1<<m);
    chushihua();
    //for(i=0;i<z;i++)cout<<num[i]<<' ';cout<<endl<<endl;
    //for(i=0;i<z;i++)cout<<flag[i]<<' ';cout<<endl<<endl;
    //for(i=0;i<n;i++)cout<<ans[i]<<' ';cout<<endl<<endl;
    int maxb=0;
    if(n==1){
      for(i=0;i<z;i++){
        if(flag[i]&&((i&ans[0])==0||i==0)){
          maxb=max(maxb,num[i]);
        }
      }
    }
    if(n>=2)
    for(i=0;i<z;i++){
      if(flag[i]&&(i==0||((i&ans[1])==0)))
      for(j=0;j<z;j++){
        if(flag[j]&&(j==0||(j&ans[0])==0)&&(i&j)==0){
          dp[1][i][j]=num[i]+num[j];
          maxb=max(maxb,dp[1][i][j]);
        }
      }
    }/*
    for(i=0;i<z;i++){
      for(j=0;j<z;j++){
        cout<<dp[1][i][j]<<' ';
      }
      cout<<endl;
    }
    system("pause");*/
    for(s=2;s<n;s++){
      for(i=0;i<z;i++){
        if(flag[i]&&(i&ans[s])==0){
          //cout<<"i "<<i<<" ";
          for(j=0;j<z;j++){
            if(flag[j]&&(j&ans[s-1])==0&&(i&j)==0){
              //cout<<" j "<<j<<' ';
              for(k=0;k<z;k++){
                if(flag[k]&&(k&ans[s-2])==0&&(j&k)==0&&(i&k)==0){
                  dp[s][i][j]=max(dp[s][i][j],dp[s-1][j][k]+num[i]);
                  //cout<<" k "<<k<<' '<<dp[s][i][j]<<endl;
                  if(s==n-1)maxb=max(maxb,dp[s][i][j]);
                }
              }
            }
          }
        }
        //cout<<endl;
      }
    }
    cout<<maxb<<endl;
  }
}

 

posted @ 2013-09-09 09:28  龙城星  阅读(221)  评论(0编辑  收藏  举报