牛客练习赛58 C 矩阵消除游戏 - 贪心

考虑到 \(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;
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12380543.html
今日推荐