矩阵消除游戏代码
由于行的选择会影响列,考虑到数据范围较小,可以考虑枚举思路。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 20;
int n, m, k;
int a[N][N];
int col[N];
int calc(int n) {
int ret = 0;
while(n) {
n &= n - 1;
ret++;
}
return ret;
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
int ans = 0;
for(int st = 0; st <= (1 << n); st++) {
int cnt = calc(st);
if(cnt > k) continue;
memset(col, 0, sizeof col);
int sum = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(st >> i - 1 & 1) sum += a[i][j];
else col[j] += a[i][j];
}
}
sort(col + 1, col + m + 1, greater<int>());
for(int i = 1; i <= min(k - cnt, m); i++) {
sum += col[i];
}
ans = max(ans, sum);
}
cout << ans << endl;
return 0;
}

