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; } }