50分求助
查看原帖
50分求助
310524
Scherzo楼主2022/11/22 09:14

rt wa34568 死活找不到哪错了

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=110;
const int W=N<<2;

int n,m,cnt;
int num[W],s[W],g[N][N];
int f[N][W][W],ans;

inline void dp () {
	for (register int i=1;i<=cnt;i++) {
		if ((s[i]|g[1][0])!=g[1][0]) continue;
		f[1][1][i]=num[i];
		for (register int j=1;j<=cnt;j++) {
			if ((s[j]|g[2][0])!=g[2][0]) continue;
			if ((s[i]&s[j])) continue;
			f[2][i][j]=num[i]+num[j];
		}
	}
	//row
	for (register int i=3;i<=n;i++) {
		for (register int j=1;j<=cnt;j++) {
			for (register int k=1;k<=cnt;k++) {
				for (register int t=1;t<=cnt;t++) {
					if ((s[j]|g[i-2][0])!=g[i-2][0]) continue;
					if ((s[k]|g[i-1][0])!=g[i-1][0]) continue;
					if ((s[t]|g[i][0])!=g[i][0]) continue;
					//-2 & -1
					if ((s[j]&s[k])) continue;
					//-1 & this
					if ((s[k]&s[t])) continue;
					//-2 & this
					if ((s[j]&s[t])) continue;
					
					f[i][k][t]=f[i-1][j][k]+num[t];
				}
			}
		}
	}
}

int main () {
	scanf("%d%d",&n,&m);
	for (register int i=1;i<=n;i++) {
		for (register int j=1;j<=m;j++) {
			char c; cin>>c;
			if (c=='P') g[i][j]=1;
			else g[i][j]=0;
			g[i][0]+=pow(2,m-j)*g[i][j];
		}
	}
	for (register int i=0;i<(1<<m);i++) {
		if (i&(i<<1)|(i&(i<<2))) continue;
		int sum=0;
		for (register int j=0;j<m;j++) {
			if (i&(1<<j)) sum++;
		}
		s[++cnt]=i;
		num[cnt]=sum; 
	}
	dp();
	for (register int i=1;i<=cnt;i++) {
		for (register int j=1;j<=cnt;j++) {
			ans=max(ans,f[n][i][j]);
		}
	}
	printf("%d\n",ans);
	return 0;
}

2022/11/22 09:14
加载中...