求助,一晚上调到崩溃
查看原帖
求助,一晚上调到崩溃
543206
shiroko2008楼主2022/7/23 22:42

20pts,wa on #3,4,5,6,7,8,9,10

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
bool piece (int s,int k) {
	return s&(1<<k);
}
bool isok (int s) {
	for (int i=2;i<m;i++) if ((piece(s,i)&piece(s,i-1))||(piece(s,i)&piece(s,i-2))) return 0;
	return 1;
}
int count_bit (int s) {
	int ans=0;
	for (int i=0;i<m;i++) if (piece(s,i)) ans++;
	return ans;
}
int main()
{
	cin>>n>>m;
	char c[n][m];
	for (int i=0;i<n;i++) for (int j=0;j<m;j++) cin>>c[i][j];
	int s[100];
	memset(s,0,sizeof(s));
	for (int i=0;i<n;i++) for (int j=0;j<m;j++) if (c[i][j]=='P') s[i]|=(1<<j);
	int dp[2][1<<m][1<<m];
	memset(dp,0,sizeof(dp));
	for (int i=0;i<(1<<m);i++) {
		if (!isok(i)) continue;
		for (int j=0;j<(1<<m);j++) {
			if (!isok(j)) continue;
			if (i&j) continue;
			dp[0][i][j]=count_bit(i)+count_bit(j);
		}
	}
	for (int i=2;i<n;i++) {
		for (int x=s[i-2];x;x=(x-1)&s[i-2]) {
			if (!isok(x)) continue;
			//if (x&~s[i-2]) continue; 
			for (int y=(((1<<m)-1)-x)&s[i-1];y;y=(((1<<m)-1)-x)&s[i-1]&(y-1)) {
				if (!isok(y)) continue;
				//if (x&y) continue;
				//if (y&~s[i-1]) continue;
				//cout<<i<<' '<<((((1<<m)^x^y))&s[i])<<' '<<x<<' '<<y<<' '<<s[i]<<' '<<((1<<m-1))<<endl;
				for (int z=((((1<<m)-1)-x-y))&s[i];z;z=(z-1)&(((((1<<m)-1)-x-y))&s[i])) {
					if (!isok(z)) continue;
					//if (z&~s[i]) continue;
					//if (x&z) continue;
					//if (y&z) continue;
					dp[1][y][z]=count_bit(z)+dp[0][x][y];
					//cout<<i<<' '<<x<<' '<<y<<' '<<z<<' '<<endl;
				}
			}
		}
		for (int x=0;x<(1<<m);x++) for (int y=0;y<(1<<m);y++) dp[0][x][y]=dp[1][x][y];
	}
	int ans=0;
	for (int x=0;x<(1<<m);x++) for (int y=0;y<(1<<m);y++) ans=max(ans,dp[0][x][y]);
	cout<<ans<<endl;
	//cout<<isok(24)<<' '<<piece(145,3)<<' '<<(6&~s[0])<<' '<<((1<<m)&~s[0])<<' '<<s[2];
	//cout<<s[2];
	return 0;
}
2022/7/23 22:42
加载中...