hack过了,萌新50pts求助
查看原帖
hack过了,萌新50pts求助
673280
at_half楼主2024/7/22 08:48
#include<bits/stdc++.h>
#define bp __builtin_popcount
#define int long long 
using namespace std;
const int N=2050;
int n,m,res,cnt[N],sit[110][N][2],f[110][N],ans,a[N];
bool cmp(int s0,int s1,int a0,int a1){
	if((s0&a0)==0&&(s1&a1)==0)return 1;
	return 0;
}
signed main(){
	char x;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>x;
			if(x=='P')a[i]<<=1;
			else a[i]<<=1,a[i]++;
		}
	for(int i=1;i<=n;i++){
		for(int s0=0;s0<(1<<m);s0++)
		for(int s1=0;s1<(1<<m);s1++)
			if(cmp(s0,s1,a[i],a[i-1])&&(((s0<<2)|(s0<<1)|(s0>>1)|(s0>>2))&s0)==0&&(((s1<<2)|(s1<<1)|(s1>>1)|(s1>>2))&s1)==0&&((s0&s1)==0))
				sit[i][++cnt[i]][0]=s0,sit[i][cnt[i]][1]=s1;
	}
	for(int i=1;i<=cnt[1];i++)f[1][i]=bp(sit[1][i][0]);
	for(int i=1;i<=n;i++)
		for(int res=1;res<=cnt[i];res++){
			for(int l=1;l<=cnt[i-1];l++){
				if(sit[i][res][1]==sit[i-1][l][0]&&(sit[i][res][0]&sit[i-1][l][1])==0&&f[i-1][l]!=0){
					f[i][res]=max(f[i][res],f[i-1][l]+bp(sit[i][res][0]));
				}
			}
		}
	for(int i=1;i<=cnt[n];i++)
		ans=max(ans,f[n][i]);
	cout<<ans<<endl;
	return 0;
}
2024/7/22 08:48
加载中...