- [NOI2001] 炮兵阵地
2
- @ 2026-8-10 12:00:07
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int f[105][65][65],a[1025],mp[1025];
int lowbit(int x){
return x&-x;
}
int bitcount(int x){
int cnt=0;
while(x){
x-=lowbit(x);
cnt++;
}
return cnt;
}
bool check(int x){
if(((x<<1)&x)||((x<<2)&x)) return false;
return true;
}
signed 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') mp[i]|=(1<<j);
}
}
int cnt=0;
for(int i=0;i<(1<<m);i++){
if(check(i)) a[++cnt]=i;
}
for(int i=0;i<=n;i++){
for(int j=1;j<=cnt;j++){
for(int k=1;k<=cnt;k++){
f[i][j][k]=-1e18;
}
}
}
f[0][1][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=cnt;j++){
int s=a[j];
if(s&mp[i]) continue;
for(int k=1;k<=cnt;k++){
int p=a[k];
if(s&p) continue;
for(int l=1;l<=cnt;l++){
int t=a[l];
if((s&t)||(p&t)) continue;
f[i][j][k]=max(f[i-1][k][l]+bitcount(s),f[i][j][k]);
}
}
}
}
int ans=0;
for(int i=1;i<=cnt;i++){
for(int j=1;j<=cnt;j++){
ans=max(ans,f[n][i][j]);
}
}
cout << ans;
return 0;
}
0 条评论
目前还没有评论...
信息
- ID
- 529
- 时间
- ms
- 内存
- MiB
- 难度
- 9
- 标签
- 递交数
- 107
- 已通过
- 30
- 上传者