#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>

void solve() {
    int n, m;
    cin >> n >> m;

    vector<int> bad(n + 1);
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < m; j++) {
            char x; cin >> x; if (x == 'H') bad[i] |= 1 << j;
        }
    }

    auto good = [&] (int i, int x) {
        if (x & bad[i]) return 0;
        if (((x >> 2) | (x >> 1)) & x) return 0;
        return 1;
    };

    vector<int> goodState;
    for (int i = 0; i < 1 << m; i++) {
        if (good(0, i)) goodState.push_back(i);
    }

    const int inf = 1e9;
    vector dp(1 << m, vector<int>(1 << m, -inf));
    dp[0][0] = 0;

    vector subSet(1 << m, vector<int>());
    for (int x = 0; x < 1 << m; x++) {
        for (int y = 0; y <= x; y++) {
            if ((y & x) == y) {
                subSet[x].push_back(y);
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        vector ndp(1 << m, vector<int>(1 << m, -inf));
        for (auto y : goodState) for (auto z : goodState) if (dp[y][z] >= 0) {
            int badi = y | z | bad[i];
            int can = ((1 << m) - 1) ^ badi;
            for (auto x : subSet[can]) {
                ndp[x][y] = max(ndp[x][y], dp[y][z] + __builtin_popcount(x));
            }
        }
        dp = move(ndp);
    }

    int res = 0;
    for (auto x : goodState) for (auto y : goodState) res = max(res, dp[x][y]);
    cout << res << '\n';
}
signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}
/*
g++ -std=c++20 1.cpp -o 1 && 1 < in.txt > out.txt
*/

0 条评论

目前还没有评论...

信息

ID
529
时间
ms
内存
MiB
难度
9
标签
递交数
21
已通过
10
上传者