20pts求调
查看原帖
20pts求调
664034
_xxxxx_楼主2024/3/15 19:39

hack过了,但是只过了两个点。

#include <bits/stdc++.h>
using namespace std;
int n, m, ans;
int dp[105][1 << 11][1 << 11];
int a[105];
char c;
signed main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			scanf("%1s", &c);
			if(c == 'P') a[i] += (1 << (j - 1));
		}
	}
	for(int j = 0; j <= (1 << m) - 1; j++)
	{
		if((j & (j << 1)) || (j & (j << 2)) || !(j & a[1])) continue;
		dp[1][j][0] = __builtin_popcount(j);
	}
	for(int j = 0; j <= (1 << m) - 1; j++)
	{
		if((j & (j << 1)) || (j & (j << 2)) || !(j & a[2])) continue;
		for(int k = 0; k <= (1 << m) - 1; k++)
		{
			if((k & (k << 1)) || (k & (k << 2)) || (j & k) || !(k & a[1])) continue;
			dp[2][j][k] = dp[1][k][0] + __builtin_popcount(j);
		}
	}
	for(int i = 3; i <= n; i++)
	{
		for(int j = 0; j <= (1 << m) - 1; j++)
		{
			if((j & (j << 1)) || (j & (j << 2)) || !(j & a[i])) continue;
			for(int k = 0; k <= (1 << m) - 1; k++)
			{
				if((k & (k << 1)) || (k & (k << 2)) || (j & k) || !(k & a[i - 1])) continue;
				for(int x = 0; x <= (1 << m) - 1; x++)
				{
					if((x & (x << 1)) || (x & (x << 2)) || !(x & (a[i - 2])) || x & k || x & j) continue;
					dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][x] + __builtin_popcount(j));
				}
			}
		}
	}
	for(int i = 0; i < (1 << m); i++) for(int j = 0; j < (1 << m); j++) ans = max(ans, dp[n][i][j]);
	cout << ans << endl;
	return 0;
}
2024/3/15 19:39
加载中...