wa80pt

P2704 [NOI2001] 炮兵阵地

LonginusMonkey @ 2023-10-26 23:29:28

对模板打的

#include<bits/stdc++.h>
using namespace std;
int dp[2025][2025][12];
char ch[2025][2025];
int a[2025];
int SUM[2025];
int n, m;
int getsum(int index) {
    int tot = 0;
    while(index) {
        if(index & 1) {
            tot++;
        }
        index /= 2;
    }
    return tot;
}
int main() {
    cin >> n >> m;
    for(int i=0; i<n; ++i) {
        for(int j=0; j<m; ++j) {
            cin >> ch[i][j];
            if(ch[i][j] == 'H') {
                a[i] = a[i] << 1;
                a[i] += 1;
            } else {
                a[i] <<= 1;
            }
        }
    }
    for(int i=0; i<(1<<m); ++i) {
        SUM[i] = getsum(i);
    }
    for(int i=0; i<(1<<m); ++i) {
        if(!((i & a[0]) || (i & (i<<1)) || (i & (i << 2)))) {
            dp[0][i][0] = SUM[i];
        }
    }
    for(int i=0; i<(1<<m); ++i) {
        for(int j=0; j<(1<<m); ++j) {
            if(!(i & j || i & a[0] || j & a[0] || i & (i << 2) || j & (j << 2) || i & (i << 1) || j & (j << 1))) {
                dp[i][j][1] = SUM[i] + SUM[j];
            }
        }
    }
    for(int i=2; i<n; ++i) {
        for(int j=0; j<(1<<m); ++j) {
            if(j&a[i-1] || (j&(j<<1)) || (j&(j<<2))) {
                continue;
            }
            for(int k=0; k<(1<<m); ++k) {
                if(k&a[i] || (k&(k<<1)) || (k&(k<<2)) || k & j) {
                    continue;
                }
                for(int l=0; l<(1<<m); ++l) {
                    if(l&a[i-2] || (l&(l<<1)) || (l&(l<<2)) || l & k || l & j) {
                        continue;
                    }
                    dp[j][k][i%3]=max(dp[j][k][i%3],dp[l][j][(i-1)%3]+SUM[k]);
                }
            }
        }
    }
    int ans = 0;
    for(int i=0;i<(1<<m);i++)
        for(int j=0;j<(1<<m);j++)
            ans=max(ans,dp[i][j][(n-1)%3]);
    cout << ans;
    return 0;
}

by SpringQinHao @ 2024-05-12 11:38:29

同,等我研究出来了找你……


|