给定一个 \(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;
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-15
  • 2022-12-23
  • 2019-11-03
  • 2021-08-27
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-03-03
  • 2022-12-23
  • 2021-09-07
  • 2021-12-03
  • 2022-12-23
相关资源
相似解决方案