AcWing 292. 炮兵阵地
原题链接
中等
作者:
修仙修仙
,
2024-10-04 23:20:39
,
所有人可见
,
阅读 2
#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int M=1<<11;
int dp[2][M][M];
bool check(int x)
{
if(x&(x>>1)||x&(x>>2)||(x>>1)&(x>>2))return 0;
return 1;
}
int count(int x)
{
int cnt=0;
for(int i=30;i>=0;i--)
{
if((x>>i)&1)cnt++;
}
return cnt;
}
int main()
{
int n,m;
cin>>n>>m;
vector<int>g(n+1);
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
char x;
cin>>x;
if(x=='H')g[i]+=(1<<j);
}
}
unordered_map<int,int>cnt;
vector<int>state;
for(int i=0;i<1<<m;i++)
{
if(check(i)){
state.push_back(i);
cnt[i]=count(i);
}
}
for(int i=1;i<=n+2;i++)
{
for(int j=0;j<state.size();j++)
{
for(int k=0;k<state.size();k++)
{
for(int u=0;u<state.size();u++)
{
int a=state[u],b=state[j],c=state[k];
if((a&b)||(a&c)||(b&c))continue;
if(g[i]&c)continue;
dp[i&1][j][k]=max(dp[i&1][j][k],dp[(i-1)&1][u][j]+cnt[c]);
}
}
}
}
cout<<dp[(n+2)&1][0][0];
}