本地AC, 提交WA #1 #8 求助
查看原帖
本地AC, 提交WA #1 #8 求助
86973
花园Serena楼主2020/11/14 15:17

RT,不知道为什么会WA,代码如下

#include <bits/stdc++.h>
using namespace std;
#define R register int
int f[1025][1025][5], sum[1024], a[100 + 10], Max = 0;
int inline did (int x) {
    int tot = 0;
    while (x) {if(x & 1) tot ++; x >>= 1;}
    return tot;
}
bool inline use (int x, int y) {
    if(!((x & y) || (x & a[0]) ||( y & a[1]) || (x & (x << 1)) || ((x << 2) & x) || ((y << 1) & y) || (y & (y << 2))))
        return true;
    return false; 
}
int main ()  {
    int n, m; scanf("%d%d", &n, &m);
    for (R i = 0; i < n; i ++) {
        char end = getchar();
        for(R j = 0; j < m; j ++) {
            char x = getchar();
            a[i] <<= 1;
            if(x == 'H') a[i] += 1;
        }
    }
    for(R i = 0; i < (1 << m); i ++) 
        sum[i] = did(i);
    for(R i = 0; i < (1 << m); i ++)
        if(!(i & a[1] || (i & (i << 1)) || (i & (i << 2))))
            f[0][i][0] = sum[i];
    for(R i = 0; i < (1 << m); i ++)
        for(R j = 0; j < (1 << m); j ++)
            if(use(i, j)) f[i][j][1] = sum[i] + sum[j];
    for (R i = 2; i < n; i ++)
        for(R j = 0; j < (1 << m); j ++) {
            if((j & a[i - 1]) || ((j << 1) & j) || (j & (j << 2))) continue;
            for(R k = 0; k < (1 << m); k ++) {
                if((k & a[i]) || (k & j) || (k & (k << 1)) ||( k & (k << 2))) continue;
                for(R t = 1; t < (1 << m); t ++) {
                    if((t & j) || (t & k) || (t & a[i - 2]) || (t & (t << 1)) || (t & (t << 2))) continue;
                    f[j][k][i % 3] = max(f[j][k][i % 3], f[t][j][(i - 1) % 3] + sum[k]);
                }
            }
        }
    for(R i = 0; i < (1 << m); i ++)
        for(R j = 0; j < (1 << m); j ++)
            Max = max(Max, f[i][j][(n - 1) % 3]);
    printf("%d\n", Max);
    return 0;
}
2020/11/14 15:17
加载中...