zoukankan      html  css  js  c++  java
  • 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;
      }
    }
    
    
  • 相关阅读:
    MFC的序列化的一点研究.
    一次LoadRunner的CPC考试经历
    LAMP架构上(一)
    文件和目录管理
    如何在Linux上清理内存缓存、缓冲与交换空间
    Linux Shell基础(下)
    防火墙(上)
    LAMP架构(三)
    LNMP(二)
    LNMP(一)
  • 原文地址:https://www.cnblogs.com/dowson/p/3309172.html
Copyright © 2011-2022 走看看