矩阵消除游戏

矩阵消除游戏

https://ac.nowcoder.com/acm/problem/200190

思路:
贪心+枚举
1.如果,那么我们可以把矩阵全部拿完,此时令是不影响结果的,同时可以避免后面处理时把这种情况跳过了。
2.枚举选那几行的情况通过二进制表示,标记那几行选了用01串表示,1表示选,0表示不选。
3.确定了行后,计算每一列的和,剩下的次数选列的和最大的。
还不明白可以去看雨巨的讲解。
Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[20][20];
long long sh[20],sl[20],ans;
bool b[20];
bool cmp(int a,int b) {
    return a>b;
}
int deal(int x) {
    memset(b,0,sizeof b);
    int cnt=0,i=1;
    while(x) {
        if(x&1) {
            ++cnt;
            b[i]=1;
        }
        x>>=1;
        ++i;
    }
    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 x=0;x<=tmp;++x) {
        int numh=deal(x);
        int numl=k-numh;
        if(numl<0) continue;
        long long  sum=0;
        for (int i = 1; i <= n; i++)
            if(b[i]) sum+=sh[i];
        memset(sl, 0, sizeof(sl));
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!b[i]) sl[j]+=a[i][j];
        sort(sl+1, sl+1+m,cmp);
        for(int i=1;i<=numl;++i) sum += sl[i];
        ans=max(ans,sum);
    }
    printf("%lld\n", ans);
    return 0;
}

为雨巨打call

全部评论
博主,雨巨讲过这道题吗?我没看到呢
点赞 回复 分享
发布于 2020-07-06 19:34

相关推荐

头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务