20pts求调,玄关
查看原帖
20pts求调,玄关
1263684
Elysialr楼主2024/10/29 20:25

ACon #1 #9 #11 #12 其他全WA```cpp #include<bits/stdc++.h> using namespace std; #define ll long long

ll dp[101][(1<<11)]; ll sum[(1<<11)]; ll n,m,size,res; ll s[101];

int main(){ cin>>m>>n; size=(1<<n);

for(int i=1;i<=m;i++){
    string str;
    cin>>str;
    for(int j=0;j<n;j++)
    if(str[j]=='H')
    s[i]+=(1<<j);
}

for(int i=0;i<size;i++)
for(int j=i;j>0;j>>=1)
if(j&1){
    sum[i]++;
    if(((j>>1)&1)||((j>>2)&1)){
        sum[i]=-1;
        break;
    }
}

for(int i=1;i<=m;i++)
for(int j=0;j<size;j++){
    if(sum[j]==-1) continue;
    if(j&s[i]) continue;

    if(i>=2) for(int k=0;k<size;k++){
        if(sum[k]==-1) continue;
        if(k&s[i-1]) continue;
        if(k&j) continue;

        if(i>=3) for(int h=0;h<size;h++){
            if(sum[h]==-1) continue;
            if(h&s[i-2]) continue;
            if(h&j) continue;
            if(h&k) continue;

            dp[i][j]=max(dp[i][j],dp[i-2][h]+sum[k]+sum[j]);
        }
        else dp[i][j]=max(dp[i][j],dp[i-1][k]+sum[j]);
    }
    else dp[i][j]=sum[j];
}

for(int i=0;i<size;i++)
res=max(res,dp[m][i]);
cout<<res;

return 0;

}

2024/10/29 20:25
加载中...