社区讨论
改良版的状态压缩, 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 条回复,欢迎继续交流。
正在加载回复...