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;
}