矩阵消除游戏
灵感来源https://blog.nowcoder.net/n/6bcd181f88684b9a85c359f84a44539e
矩阵消除游戏
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20;
int n, m, k;
int a[N][N];
ll sh[N], sl[N], res = 0;
bool st[N];
int deal(int x) {
memset(st, 0, sizeof st);
int cnt = 0, i = 1;
while(x) {
if(x & 1) {
cnt++;
st[i] = true;
}
i++;
x >>= 1;
}
return cnt;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
sh[i] += a[i][j];
}
if(k > n) k = n;
if(k > m) k = m;
int tmp = (1 << n) - 1;
for(int i = 0; i <= tmp; i++) {
int numh = deal(i);
int numl = k - numh;
if(numl > m || numl < 0) continue;
ll sum = 0;
for(int i = 1; i <= n; i++) if(st[i]) sum += sh[i];
memset(sl, 0, sizeof sl);
for(int j = 1; j <= n; j++)
for(int k = 1; k <= m; k++) {
if(!st[j]) sl[k] += a[j][k];
}
sort(sl + 1, sl + 1 + m);
for(int j = 1, k = m; j <= numl; j++, k--) sum +=sl[k];
res = max(res, sum);
}
printf("%lld\n", res);
return 0;
} 这题范围为15 应该是暴力枚举
不能用贪心的想法去做这到题,是因为选完最优的状态之后会对后面的最优状态产生影响

