状压90pts求助,#1没过
查看原帖
状压90pts求助,#1没过
982540
123456a01楼主2023/7/10 19:11
#include<bits/stdc++.h>
using namespace std;
int n,m,mp[102],num[200],a[102][200],f[102][200][200];
inline int maxx(int x,int y){
	return x>y?x:y;
}
void pre(){
	for(int k=1;k<=n;k++){
		for(int i=0;i<(1<<m);i++){
			if((i&mp[k])||(i&(i<<1))||(i&(i<<2))) continue;
			a[k][++a[k][0]]=i;
			if(num[i]||(!i)) continue;
			for(int j=0;j<m;j++){
				if(i&(1<<j)) num[i]++;
			}
		}
	}
}
int main(){
	char c;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		getchar();
		for(int j=1;j<=m;j++){
			c=getchar();
			mp[i]=(mp[i]<<1)|(c=='H');
		}
	}
	pre();
	for(int i=1;i<=a[1][0];i++) f[1][i][0]=num[a[1][i]];
	if(n==1){
		int x=0;
		for(int i=1;i<=a[1][0];i++) x=maxx(x,f[1][i][0]);
		printf("%d",x);
		return 0;
	}
	for(int i=1;i<=a[2][0];i++){
		for(int j=1;j<=a[1][0];j++){
			if(!(a[2][i]&a[1][j])) f[2][i][j]=f[1][j][0]+num[a[2][i]];
		}
	}
	for(int i=3;i<=n;i++){
		for(int j=1;j<=a[i][0];j++){
			for(int s1=1;s1<=a[i-1][0];s1++){
				if(a[i][j]&a[i-1][s1]) continue;
				for(int s2=1;s2<=a[i-2][0];s2++){
					if((a[i][j]&a[i-2][s2])||(a[i-1][s1]&a[i-2][s2])) continue;
					f[i][j][s1]=maxx(f[i][j][s1],f[i-1][s1][s2]+num[a[i][j]]);
				}
			}
		}
	}
	int x=0;
	for(int i=1;i<=a[n][0];i++)
		for(int j=1;j<=a[n-1][0];j++)
			x=maxx(x,f[n][i][j]);
	printf("%d",x);
	return 0;
}
2023/7/10 19:11
加载中...