Huanlin_ @ 2019-11-01 17:45:32
九个点都能过,#8却WA了 半天没看出来哪里有问题。。。 希望dalao救救蒟蒻
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
int map[233];
int f[3][1 << 10][1 << 10];
int state[1 << 10];
int num[1 << 10];
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
char p;
cin >> p;
map[i] += (p == 'P') << (j - 1);
}
for(int i = 1; i <= (1 << m) - 1; i++) state[i] = !((i << 2) & i) && !((i >> 2) & i) && !((i << 1) & i) && !((i >> 1) & i);
for(int i = 1; i <= (1 << m) - 1; i++) {
int tem = i;
while(tem) {
num[i]++;
tem -= (-tem & tem);
}
}
f[0][0][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= (1 << m) - 1; j++) {
if(!state[j]) continue;
if((j & map[i]) != j) continue;
for(int k = 0; k <= (1 << m) - 1; k++) {
if(!state[k]) continue;
if(k & j) continue;
for(int l = 0; l <= (1 << m) - 1; l++) {
if(!state[l]) continue;
if(l & j) continue;
if(k & l) continue;
f[i % 3][j][k] = max(f[(i - 1) % 3][k][l] + num[j], f[i % 3][j][k]);
}
}
}
int ans = -1;
for(int i = 0; i <= (1 << m) - 1; i++)
for(int j = 0; j <= (1 << m) - 1; j++)
ans = max(ans, f[n % 3][i][j]);
cout << ans;
return 0;
}
by cbio @ 2020-01-16 19:33:24
一样啊 我感觉和字符串读入有关