求助

P2704 [NOI2001] 炮兵阵地

iqer @ 2021-09-30 22:44:03

#include <bits/stdc++.h>
using namespace std;

char x;
int n, m, line[105], t[105][1025], f[105][1025];
int check(int s){
    int num = 0;
    while(s){
        if(s & 1)++num;
        s >>= 1;
    }
    return num;
}
int main(){
    freopen("in.txt", "r", stdin);
    cin >> n >> m;
    for(int i = 1; i <= n; ++i){
        getchar();
        for(int j = 0; j < m; ++j){
            cin >> x;
            if(x == 'P')line[i] = (line[i] << 1) | 1;
            else line[i] = (line[i] << 1) | 0;
            // cout << x;
        }
        // cout << endl;
    }
    // for(int i = 1; i <= n; ++i)cout << line[i] << endl;
    t[0][0] = 1; t[0][1] = 0;
    for(int i = 0; i < (1 << m); ++i){
        if(!(i & (i << 2)) && !(i & (i << 1)) && !(i & (i >> 1)) && !(i & (i >> 2))){
            for(int j = 1; j <= n; ++j){
                if((line[j] & i) == i){
                    ++t[j][0];
                    t[j][t[j][0]] = i;
                }
            }
        }
    }
    // for(int i = 1; i <= n; ++i){
    //     for(int j = 1; j <= t[i][0]; ++j){
    //         cout << t[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    for(int i = 1; i <= t[1][0]; ++i)f[1][i] = check(t[1][i]);
    for(int i = 2; i <= n; ++i){
        for(int j = 1; j <= t[i][0]; ++j){
            for(int k = 1; k <= t[i - 2][0]; ++k){
                for(int m = 1; m <= t[i - 1][0]; ++m){
                    if(!(t[i][j] & t[i - 2][k]) && !(t[i][j] & t[i - 1][m]) && !(t[i - 2][k] & t[i - 1][m])){
                        f[i][j] = max(f[i][j], f[i - 2][k] + check(t[i - 1][m]) + check(t[i][j]));
                    }
                }
            }
        }
    }
    // for(int i = 1; i <= n; ++i){
    //     for(int j = 1; j <= t[i][0]; ++j){
    //         cout << f[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    int ans = -1;
    for(int i = 1; i <= t[n][0]; ++i)ans = max(ans, f[n][i]);
    cout << ans;
    return 0;
}

|