100pts求条
查看原帖
100pts求条
476455
qiuweiheng楼主2025/8/30 12:21

两个subtask都是WA

#include<bits/stdc++.h>
using namespace std;
#define N 102
#define M 11
inline int read(){
	register int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
int n,m,tot,ans;
char c;
int a[N][M],F[N],s[1<<M],cnt[1<<M];
int f[3][1<<M][1<<M];
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>c;
			if (c=='H')a[i][j]=1;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			F[i]=(F[i]<<1)+a[i][j];
	for(int i=0;i<(1<<m);i++)
		if ((!(i&(i<<1)))&&(!(i&(i<<2)))&&(!(i&(i>>1)))&&(!(i&(i>>2))))s[++tot]=i,cnt[tot]=__builtin_popcount(i);
	for(int i=1;i<=tot;i++)
		if ((s[i]&F[1])==0)f[1][i][0]=cnt[i];
	for(int i=1;i<=tot;i++)
		if ((s[i]&F[2])==0)
			for(int j=1;j<=tot;j++)
				if ((s[i]&s[j])==0&&(s[j]&F[1])==0)f[2][i][j]=cnt[i]+cnt[j];
	for(int i=3;i<=n;i++){
		for(int j=1;j<=tot;j++){//i
			if (F[i]&s[j])continue;
			for(int k=1;k<=tot;k++){
				if ((s[j]&s[k])||(F[i-1]&s[k]))continue;
				for(int l=1;l<=tot;l++){
					if ((s[j]&s[l])||(s[k]&s[l])||(F[i-2]&s[l]))continue;
					f[i%3][j][k]=max(f[i%3][j][k],f[(i-1)%3][k][l]+cnt[j]);
				}	
			}
		}
	}
	cout<<s[0]<<endl;
	for(int i=1;i<=tot;i++)
		for(int j=1;j<=tot;j++)ans=max(ans,f[n%3][i][j]);
	cout<<ans<<'\n';
	return 0;
}
2025/8/30 12:21
加载中...