(待解决) hdu HDU4539 郑厂长系列故事——排兵布阵 (状态压缩dp~)

来源:互联网 发布:广东广播开放大学网络 编辑:程序博客网 时间:2024/05/02 01:01

依旧是怎么也找不出bug系列。。。

:-(

先放这

#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define Max 150int n, m;int row[Max];int dp[Max][200][200];int num[200];int nstate;int state[200];void init() {    nstate = 0;    for (int i = 0; i < (1 << m); i++) {        if (i & (i << 2)) continue;        state[nstate++] = i;    }}int count_one(int x) {    int cnt = 0;    while (x) {        cnt++;        x &= (x - 1);    }    return cnt;}int main(void) {    int x;    while (~scanf("%d%d", &n, &m)) {        memset(dp, -1, sizeof(dp));        memset(state, 0, sizeof(state));        init();        memset(row, 0, sizeof(row));        memset(num, 0, sizeof(num));        for (int i = 0; i < n; i++) {            for (int j = m - 1; j >= 0; j--) {                scanf("%d", &x);                row[i] += (!x) << j;            }        }        for (int i = 0; i < nstate; i++) {            num[i] = count_one(i);            if (row[0] & state[i]) continue;            dp[0][0][i] = num[i];        }        for (int i = 1; i < n; i++) {            for (int j = 0; j < nstate; j++) {                if (row[i] & state[j]) continue;                for (int k = 0; k < nstate; k++) {                    if (row[i - 1] & state[k]) continue;                    if (((k << 1) & j) || ((k >> 1) & j)) continue;                    for (int t = 0; t < nstate; t++) {                        if (dp[i - 1][t][k] == -1) continue;                        if (state[t] & state[j]) continue;                        if (((t << 1) & k) || ((t >> 1) & k)) continue;                        dp[i][k][j] =                            max(dp[i - 1][t][k] + num[j], dp[i][k][j]);                    }                }            }        }        int ans = 0;        for (int i = 0; i < nstate; i++) {            for (int j = 0; j < nstate; j++) ans = max(ans, dp[n - 1][j][i]);        }        printf("%d\n", ans);    }    return 0;}


阅读全文
0 0