萌新求助状压DP
查看原帖
萌新求助状压DP
610557
shinzanmonoszm 妹妹楼主2022/10/5 16:49
#include <bits/stdc++.h>
using namespace std;
int f[110][110][110], a[110], sta[110], num[110];
int get(int n) {
    int ans = 0;
    while (n) {
        if (n & 1) ans++;
        n >>= 1;
    }
    return ans;
}
int main() {
    ios::sync_with_stdio(false);
    char x;
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> x, a[i] = (a[i] << 1) + (x == 'H');
    int maxn = (1 << m) - 1, cnt = 0;
    for (int i = 0; i <= maxn; i++)
        if (i & (i << 1) == 0 && i & (i << 2) == 0)
            sta[++cnt] = i, num[cnt] = get(i);
    for (int i = 1; i <= cnt; i++)
        if (sta[i] & a[1] == 0)
            f[1][i][1] = num[i];
    for (int i = 1; i <= cnt; i++)
        if (sta[i] & a[2] == 0)
            for (int j = 1; j <= cnt; j++)
                if (sta[i] & sta[j] == 0 && sta[j] & a[1] == 0)
                    f[2][i][j] = num[j] + num[i];
    for (int p = 3; p <= n; p++)
        for (int i = 1; i <= cnt; i++)
            if (sta[i] & a[p] == 0)
                for (int j = 1; j <= cnt; j++)
                    if (sta[i] & sta[j] == 0 && sta[j] & a[p - 1] == 0)
                        for (int k = 1; k <= cnt; k++)
                            if (sta[i] & sta[k] == 0 && sta[j] & sta[k] == 0 && sta[k] & a[p - 2] == 0)
                                f[p][i][j] = max(f[p][i][j], f[p - 1][j][k] + num[i]);
    int ans = 0;
    for (int i = 1; i <= cnt; i++)
        for (int j = 1; j <= cnt; j++)
            ans = max(ans, f[n][i][j]);
    cout << ans;
    return 0;
}
2022/10/5 16:49
加载中...