90分 WA在 #8 求助

P2704 [NOI2001] 炮兵阵地

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

一样啊 我感觉和字符串读入有关


|