10分求救
查看原帖
10分求救
528917
ma_niu_bi楼主2022/9/25 15:15
#include<bits/stdc++.h>
using namespace std;
int n,m,s[105],ok[105],tot,dp[105][1<<11][1<<11],sum[1<<11],ans;
char p[105];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",p+1);
		for(int j=1;j<=m;j++)s[i]=s[i]<<1|(p[j]=='H'?1:0);
	}
	for(int i=0;i<=(1<<m)-1;i++){
		int t=i;
		while(t){
			if(t&1)sum[i]++;
			t>>=1;
		}
		if((!(i&(i<<1)&(i<<2)))&&(!(i&(i>>1)&(i>>2))))ok[++tot]=i;
	}
	for(int i=3;i<=n;i++){
		for(int j=0;j<=tot;j++){
			int state1=ok[j];//这行
			if(state1&s[i])continue;
			for(int k=0;k<=tot;k++){
				int state2=ok[k];//上行
				if(state2&s[i-1])continue;
				for(int l=0;l<=tot;l++){
					int state3=ok[l];//上上行
					if(state3&s[i-2])continue;
					if(state3&state2&state1)continue;
					dp[i][state1][state2]=max(dp[i][state1][state2],dp[i-1][state2][state3]+sum[state1]);
				}
			}
		}
	}
	for(int i=0;i<=tot;i++){
		for(int j=0;j<=tot;j++){
			if(ok[i]&s[n])continue;
			if(ok[j]&s[n-1])continue;
			if(ok[i]&ok[j])continue;
			ans=max(ans,dp[n][ok[i]][ok[j]]);
		}
	}
	printf("%d\n",ans);
	return 0;
}

调了好久了QwQ

2022/9/25 15:15
加载中...