求助ACbut厌氧
查看原帖
求助ACbut厌氧
724648
light_searcher楼主2023/12/16 07:21

不开O2:一片绿

开O2:五彩斑斓

有没有大佬帮我看看咋了qwq

#include<bits/stdc++.h>
using namespace std;
const int N=105,M=15,K=66;
int n,m,g[K],c[K],cnt,h[M],f[N][K][K],ans;
char s[N][M];
int count(int x){
	int ans=0;
	while(x){
		if(x&1) ans++;
		x>>=1;
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",s[i]+1);
		for(int j=1;j<=m;j++)
			h[i]=(h[i]<<1)+(s[i][j]=='H'?1:0);
	}
	for(int i=0;i<(1<<m);i++)
		if(!(i&(i<<1))&&!(i&(i<<2))){
			g[++cnt]=i;
			c[cnt]=count(i);
			if(!(g[cnt]&h[1]))
				f[1][cnt][0]=c[cnt];
		}
	if(n==1){
		for(int i=1;i<=cnt;i++)
			if(!(g[i]&h[n]))
				ans=max(ans,f[n][i][0]);
		printf("%d",ans);
		return 0;
	}
	for(int i=1;i<=cnt;i++){
		if(g[i]&h[2]) continue;
		for(int j=1;j<=cnt;j++){
			if((g[j]&g[i])||(g[j]&h[1])) continue;
			f[2][i][j]=f[1][j][0]+c[i];
		}
	}
	for(int i=3;i<=n;i++)
		for(int j=1;j<=cnt;j++){
			if(g[j]&h[i]) continue;
			for(int k=1;k<=cnt;k++){
				if((g[j]&g[k])||(g[k]&h[i-1])) continue;
				for(int t=1;t<=cnt;t++){
					if((g[j]&g[t])||(g[k]&g[t])||(g[t]&h[i-2])) continue;
					f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+c[j]);
				}
			}
		}
	for(int i=1;i<=cnt;i++)
		for(int j=1;j<=cnt;j++)
			if(!(g[i]&g[j])&&!(g[i]&h[n])&&!(g[j]&h[n-1]))
				ans=max(ans,f[n][i][j]);
	printf("%d",ans);
	return 0;
}
2023/12/16 07:21
加载中...