0
点赞
收藏
分享

微信扫一扫

P2704 炮兵阵地

Java架构领域 2022-04-13 阅读 58
c++c语言
//#define local
#include<cstdio>
#include<iostream>
#include<vector>
#define MAXN 105
#define MAXM 11;
typedef long long ll;
using namespace std;
int n,m;
int e[MAXN];
int dp[2][1<<10][1<<10]={0};
vector<int>p,s;
int count(int k){
	int ans=0;
	while(k){
		if(k&1)
		++ans;
		k>>=1;
	}
	return ans;
}
void init(){
	for(int i=0;i<1<<m;++i){
		if(!(i<<2&i)&&!(i<<1&i)&&!(i>>2&i)&&!(i>>1&i)){
		s.push_back(i);
		p.push_back(count(i));
		}
	}
}
int find(int i){
	int ans=0;
	for(int j=0;j<s.size();++j){
		for(int k=0;k<s.size();++k){
			if(ans<dp[i%2][j][k])
			ans=dp[i%2][j][k];
		}
	}
	return ans;
}
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
scanf("%d%d",&n,&m);
init();

for(int i=1;i<=n;++i){
	char tmp[11];
	scanf("%s",tmp);
	int t=0;
	for(int j=0;j<m;++j){
		if(tmp[j]=='H'){
			t=t+(1<<(m-1-j));
		}
	}
	e[i]=t; 
}

for(int j=0;j<s.size();++j){
	if(!(e[1]&s[j]))
	dp[1][j][0]=p[j];
}
if(n==1){
	cout<<find(1);
	return 0;
}
for(int j=0;j<s.size();++j){
	if(!(e[2]&s[j])){
		for(int k=0;k<s.size();++k){
			if(!(e[1]&s[k])&&!(s[j]&s[k])){
				dp[0][j][k]=p[j]+p[k];
			}
		}
	}
}
if(n==2){
	cout<<find(2);
	return 0;
}
for(int i=3;i<=n;++i){
	for(int j=0;j<s.size();++j){
		if(!(e[i]&s[j])){
			for(int k=0;k<s.size();++k){
				if(!(e[i-1]&s[k])&&!(s[k]&s[j])){
					for(int w=0;w<s.size();++w){
						if(!(e[i-2]&s[w])&&!(s[k]&s[w])&&!(s[j]&s[w])&&(dp[i%2][j][k]<dp[(i-1)%2][k][w]+p[j])){
							dp[i%2][j][k]=dp[(i-1)%2][k][w]+p[j];
						}
					}
				}
			}
		}
	}
}
cout<<find(n);
return 0;
} 
举报

相关推荐

0 条评论