#include<bits/stdc++.h>
using namespace std;
const int N = 12,M =1<<N;
vector<int> state;
int f[2][M][M];
//已经摆完第i行,且第i行状态是j,第i-1行状态是k的炮兵最大数量(MAX)
int g[110],cnt[M];
int n,m;
bool check(int st)
{
for(int i=0;i<m;i++)
{
if(((st>>i&1)&&(st>>i+1&1))||((st>>i&1)&&(st>>i+2&1)))
return false;
}
return true;
}
int count(int st)
{
int res=0;
for(int i=0;i<m;i++)
{
res+=st>>i&1;
}
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
char c;
cin>>c;
if(c=='H')g[i]+=1<<j;
}
}
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++)
{
//第i行
for(int j=0;j<state.size();j++)
{
//第i-1行
for(int k=0;k<state.size();k++)
{
//第i-2行
for(int u=0;u<state.size();u++)
{
int a=state[j],b=state[k],c=state[u];
if((a&b)|(b&c)|(a&c))continue;
if(g[i]&a)continue;
f[i&1][j][k]=max(f[i&1][j][k],f[i-1&1][k][u]+cnt[a]);
}
}
}
}
cout<<f[n+2&1][0][0];
return 0;
}
AcWing 292. 炮兵阵地
最新推荐文章于 2024-11-10 21:43:58 发布
该博客主要探讨了一种动态规划的解决方案,用于处理棋盘上放置炮兵的问题,确保炮兵之间不会相互攻击。代码实现中,定义了检查状态合法性的函数和计算炮兵数量的函数,并通过三层循环遍历所有可能的状态组合,找到最大数量的炮兵布局。最终,程序输出在给定条件下能放置的最大炮兵数。
摘要由CSDN通过智能技术生成