蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举出来,接着再选择列,找出和最大的情况即可

怎么用二进制列举情况,比如一共有3行,我们的选择是 000 001 010 011 100 110 111,也就是说到1000结束,也就是把1左移动3就行了

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 20;
int a[N][N];
int n, m, k;
int col[N];
int calc(int x)
{
    int cnt = 0;
    while (x)
    {
        x = x & (x-1);
        cnt++;
    }
    return cnt;
    
}
bool cmp1(int x1, int x2)
{
    return x1 > x2;
}
int main()
{
    cin >> n >> m >> k;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> a[i][j];
        }
    }

    int ret = 0;
    for (int i = 0; i < (1<<n); i++)
    {
        int c = calc(i);
        if(c > k) continue;
        int sum = 0;
        int tmp = i;
        memset(col, 0, sizeof(col));
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if ((tmp >> i) & 1) sum += a[i][j];
                else
                    col[j] += a[i][j];
            }
        }
        sort(col, col + m, cmp1);
        int tmp2 = calc(tmp);
        for (int i = 0; i < k-tmp2; i++)
        {
            sum += col[i];
        }
      ret = max(ret, sum);
    }
    cout << ret << endl;


    return 0;
}
相关推荐
梦想平凡1 小时前
棋牌游戏技术实战(十三):缓存对局历史时控制容量,命中以后仍然检查成员权限
游戏·缓存
wzdark1 小时前
动态规划算法的状态转移矩阵可视化分析5
算法·矩阵·动态规划
阿阳微客3 小时前
steam游戏搬砖用选品软件照搬就可以么?经验帖
学习·游戏
FairGuard手游加固13 小时前
手游加固怎么做?SO、IL2CPP、AssetBundle 与运行时保护详解
安全·游戏·unity
Vex2une13 小时前
GRLP游戏运行库合集:一站式解决DLL缺失与启动报错实战指南 | Game Runtime Libraries Package
游戏·vc++运行库·0xc000007b·游戏运行库·dll缺失修复·directx修复·游戏报错解决
可爱系程序猿14 小时前
模型推理任务弹出找不到 cublas64_12.dll,CUDA 12 矩阵计算库按安装包核对
程序人生·线性代数·矩阵·电脑
闲云自留地21 小时前
Kubernetes 安装保姆级:关 swap、装 containerd、init 集群、calico 一篇通
容器·贪心算法·kubernetes
DevOps老兵1 天前
【老计带你懂线性代数】09:特征值与特征向量,矩阵最本质的方向
线性代数·矩阵·pca·特征值·特征向量·pagerank
tommyjiatong1 天前
SDK游戏盾的工作原理
游戏·网络安全·sdk盾
倒头就睡的小比特2 天前
贪心算法介绍
算法·贪心算法