题解:P10242 [THUSC 2021] Emiya 家明天的饭
思路
我们显然有一个
其中
不难发现其实
这样仍然是超时的,但如果你学习过 SOS DP 就可以做到在
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, ans;
int a[25][2000005], dp[25][2000005];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)cin >> a[i][j];
}
for (int i = 1; i <= m; i++) {
int now = 0;
for (int j = 1; j <= n; j++) {
if (a[j][i] != -1)now |= 1 << (j - 1);
}
for (int j = 1; j <= n; j++) {
if (a[j][i] != -1)dp[j][now] += a[j][i];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k <= (1 << n) - 1; k++) {
if (!(k & (1 << (j - 1))))dp[i][k] += dp[i][k | (1 << (j - 1))];
}
}
}
for (int i = 0; i <= (1 << n) - 1; i++) {
int now = 0;
for (int j = 1; j <= n; j++) {
if (i & (1 << (j - 1)))now += dp[j][i];
}
ans = max(ans, now);
}
cout << ans;
return 0;
}