社区讨论

改良版的状态压缩, 91分已经是极限了

P2774方格取数问题参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi6mpgip
此快照首次捕获于
2025/11/20 07:23
4 个月前
此快照最后确认于
2025/11/20 07:23
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 23, M = 129;
int n, m, num[N] = {0}, dp[2][N] = {0}, temp[M][M] = {0};
inline int lowbit(const int &x) { return x & -x; }
inline bool Check1(const int &x) { return !((x >> 1) & x); }
inline bool Check2(const int &x, const int &y) { return (x & y) == 0; }
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            scanf("%d", &temp[i][j]);
    if (m > n)
    {
        for (int i = 0; i < m; i++)
            for (int j = i + 1; j < m; j++)
                swap(temp[i][j], temp[j][i]);
        swap(n, m);
    }
    const int sta = (1 << m) - 1;
    for (int i = 0; i < n; i++)
    {
        memset(num, 0, sizeof (num)); 
        for (int j = 0; j < m; j++)
            num[1<<j] = temp[i][j]; 
        for (int j = 1; j <= sta; j++)
            if (Check1(j) && ((j&(j-1))&&j))
                for (int k = j; k; k ^= lowbit(k))
                    num[j] += num[lowbit(k)];
        for (int j = 0; j <= sta; j++)
            if (Check1(j))
            {
                int maxk = 0;
                for (int k = 0; k <= sta; k++)
                    if (Check1(k) && Check2(j, k))
                        maxk = max(maxk, dp[(i+1)&1][k]);
                dp[i&1][j] = maxk + num[j];
            }
    }
    int ans = dp[(n+1)&1][0];
    for (int i = 1; i <= sta; i++) ans = max(ans, dp[(n+1)&1][i]);
    printf("%d\n", ans);
    return 0;
}
还差最后一个点就可以AC, 但是空间已经不够了

回复

6 条回复,欢迎继续交流。

正在加载回复...