集美大学:矩阵选数零基础讲解

这篇具有很好参考价值的文章主要介绍了集美大学:矩阵选数零基础讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:集美·大学矩阵选数

本题是一道填空题,选手直接使用代码输出一个数字即可。

牛客集美大学矩阵选数,acm刷题日历,矩阵,算法,数据结构

从以上大小为 13×1313\times 1313×13 的矩阵中选择一些数,选择的数必须满足以下两个条件:

  • 每一行最多有一个数被选择;
  • 每一列最多有一个数被选择。

对选择的数进行求和得到 SumSumSum ,所有可能的选择方案中 SumSumSum 的最大值为多少分分?

输入描述:

无    

输出描述:

仅一行,包含一个数字,如题意所示,为 SumSumSum 的最大值。

二:结果代码

void Task(int TestCase) {
    const int n = 13;
    const int m = 1 << n;
    array<array<ll, n>, n> arr;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
        }
    }

    array<ll, m> dp{};
    for (int i = 0; i < n; i++) {
        array<ll, m> mdp{};
        for (int sta = 0; sta < m; sta++) {
            if (__builtin_popcountll(sta) == i + 1) {
                for (int bit = 0; bit < n; bit++) {
                    if ((sta >> bit) & 1) {
                        mdp[sta] = max(mdp[sta], dp[sta ^ (1 << bit)] + arr[i][bit]);
                    }
                }
            }
        }
        swap(dp, mdp);
    }
    cout << dp[m - 1] << '\n';
}

三:语法点讲解

1:数字左移与右移

const int m = 1 << n;

这个代码的意思是定义常量m的大小为1左移n为,即2的n次方。

2:__builtin_popcountll(sta) == i + 1

这个函数的作用是检查sta中1的个数。

3:dp[sta ^ (1 << bit)]

这个代码是将sta与1左移bit位后的数字进行异或运算(若异则为1,若同为0),具体在这个代码具有将sta的bit位取反的作用。
 
4: 如何表示13个1的二进制
将1左移13位-1即可。

四:代码具体讲解

 array<ll, m> dp{};
    for (int i = 0; i < n; i++) {
        array<ll, m> mdp{};
        for (int sta = 0; sta < m; sta++) {
            if (__builtin_popcountll(sta) == i + 1) {
                for (int bit = 0; bit < n; bit++) {
                    if ((sta >> bit) & 1) {
                        mdp[sta] = max(mdp[sta], dp[sta ^ (1 << bit)] + arr[i][bit]);
                    }
                }
            }
        }
        swap(dp, mdp);
    }
    cout << dp[m - 1] << '\n';
}

1:首先明白不同i下dp[sta]的含义:

       他的含义是在当前i下,sta的范围是0到2^13次方,对于一个固定的sta,知道他的二进制也就知道了他的列的选择,从右往左分别对应着0-12列的选择。

2:dp转化的讲解。

       对于给定的i与sta,我们首先要看sta的1的数量是否与i对应,因此有

if (__builtin_popcountll(sta) == i + 1)

注意这里的列为1的个数是i+1而不是i(由于i从0开始)。

挑选出特定的sta后,我们开始状态转移。假设当前的i为4,我们的dp[sta]保存的是i为3的最优解,i加到4后,对于特定的sta我们将sta的任意一列1(if ((sta >> bit) & 1))改为第四行的数(arr[i][j])(原本的1是是前三行同一列的数),然后再加上去掉这一列的1的最大值(已经求出)(dp[sta ^ (1 << bit)]) ,最后再对这些为1的列取最大值就行了,因此有那个max函数。

这里的转化核心就是当对于特定的i和sta(sta的1的个数为i+1),原本的dp[sta]是针对i-1的,对于已经选好的列(由sta的二进制决定),对于sta的每一个j列(j为1),我们都将这个1选择为arr[i][j],因此剩余的1的选择的最优值由dp[sta^1<<j]得知,然后对于每个j遍历一次即可获取当前i下dp[sta]的最优解。

最后那个swap函数就是更新dp数组的作用(随着i的增加而更新)。

五:代码粗略讲解(出题人题解)

牛客集美大学矩阵选数,acm刷题日历,矩阵,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-853963.html

到了这里,关于集美大学:矩阵选数零基础讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【2】--图像

    基本参数有两个,一个是采集标志位,一个是图像数组。 标志位很好理解,当摄像头采集完一帧图像,标志位会被置一,可以在主循环中不断读取标志位、当标志位是1时,你就可以读取该帧图像,处理完图像再把标志位清零,让他开始下一帧数据的采集。 根据习惯不同,也

    2024年04月10日
    浏览(37)
  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【4】--控制

    1.1舵机 舵机是控制车模方向的重要组成部分,一般放在车头,实物见下图。 C车模允许使用的有S3010,U400这两款舵机 如果比赛限制车模类型为C车模,那么只能使用S3010(已停产)或者U400舵机进行比赛,控制舵机主要是控制PWM波的脉宽。控制规律如下图。 舵机占PWM脉宽与转动角度

    2024年02月08日
    浏览(47)
  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【3】--边线提取

    当摄像头成功获取一帧图像,并且预处理(二值化)之后,我们最重要的事情就是获取赛道信息。其中最基本的就是赛道编边界信息,左边,右边,中线等基础数据。 事先声明,没有那种算法是完美的,只要算法能够得到足够多想要的信息,那么他就是好算法。 不同算法之

    2024年02月08日
    浏览(84)
  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【5】--直道、弯道、十字

    智能车花费时间最多的就是元素识别这一环节,经过我们前几章摄像头矫正,边线提取,中线计算,速度/方向控制。这几个环节都做好的话,车子是可以在简单的赛道中间进行基本的寻迹。沿着直道,弯道走。 但是想要完成比赛要求,需要对元素进行处理,包括但不限于:

    2024年02月06日
    浏览(39)
  • 山东大学单片机原理与应用实验 3.4 矩阵键盘扫描实验

    目录   一、实验题目 二、实验要求 三、实验过程及结果记录 1. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件。 2. 编写控制源程序,将其保存为keyscan_self.asm 或keyscan_self.c。 3. 将源程序添加到U1 中,并构造(build)该程序,将asm文件编译成hex文件,将可

    2024年02月05日
    浏览(48)
  • cuda 编程:矩阵运算讲解

    本文主要介绍用CUDA实现矩阵运算(C = A x B)的几个基本方法,帮助大家理解矩阵在GPU上面的运算与CPU上的有何异同,通过实践上手CUDA的优化计算,相比基础方法,能提速10倍以上。 本文内容涉及到CUDA矩阵1D运算,2D运算,共享内存,CUBLAS的使用 文中的全部code: https://github.com/CalvinX

    2023年04月11日
    浏览(36)
  • C语言判断一个矩阵是不是对称矩阵案例讲解

    我们先看对称矩阵的例图:  通过观察对称矩阵图片我们可以得出以下结论: 1)对称矩阵以主对角线为对称轴,对应位置的数字相等。也就是:aij=aji 2)如果一个矩阵是对称矩阵,那么他的转置矩阵等于他本身。 以上文对称矩阵例图为例进行代码编写。 案例代码如下: 代码

    2024年02月08日
    浏览(51)
  • C语言输出矩阵及其转置矩阵以及他们和的矩阵案例讲解

    思路分析 1.本题需要打印输出3个矩阵,分别是初始化矩阵,矩阵转置,以及他们的和的矩阵。 2.本题需要大一数学《线性代数》关于矩阵,矩阵的转置以及矩阵和的知识点作为基础。本文不做数学知识点讲解。 3,我们以3行3列矩阵举例进行讲解。 案例代码如下 代码运行结果

    2024年02月16日
    浏览(41)
  • pytorch中的矩阵切片操作完全讲解

    我们经常需要从2维或3维tensor中进行切片操作,比如从mask模型中取出mask所在位置的向量。 Talk is cheap, show me code.  以下所有维度从0开始,3维即 0,1,2 ----------------------------------------------------- 另外,pytorch的函数已经为 这种切片操作准备好了,用以下代码: batch[\\\"loss_ids \\\"] 是

    2024年02月14日
    浏览(41)
  • C语言输出矩阵最小值案例讲解

    思路分析 1.用二维数组存放矩阵的值。 2.矩阵最小值初始化为mix=arr[0][0],arr[0][0]是矩阵首行首列的值。 3.用for循环遍历矩阵的每一个值,和mix的值比较,这样就可以得到矩阵的最小值。 案例代码如下 代码运行结果如下

    2024年02月11日
    浏览(100)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包