给定一个 (n) 行 (m) 列的矩阵,每个位置有权值 (a_{i,j}),可以进行 (k) 次操作,每次任选一行或一列,将这行(列)的权值全部变为 (0),得分加上这行(列)的权值和,求最大得分
Solution
考虑到 (n,m) 很小,暴力枚举消除哪些行,然后对列贪心
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n,m,k,a[N][N],b[N][N],c[N],d[N],ans;
signed main() {
cin>>n>>m>>k;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin>>b[i][j];
}
}
for(int i=0;i<(1<<n);i++) {
memset(c,0,sizeof c);
for(int j=1;j<=n;j++) c[j]=(i>>(j-1))&1;
int tmp = __builtin_popcount(i), sum=0;
if(tmp>k) continue;
memcpy(a,b,sizeof b);
for(int j=1;j<=n;j++) if(c[j]) {
for(int k=1;k<=m;k++) sum+=a[j][k], a[j][k]=0;
}
memset(d,0,sizeof d);
for(int j=1;j<=n;j++) {
for(int k=1;k<=m;k++) d[k]+=a[j][k];
}
sort(d+1,d+m+1);
reverse(d+1,d+m+1);
for(int j=1;j<=min(m,k-tmp);j++) sum+=d[j];
ans=max(ans,sum);
}
cout<<ans;
}