• POJ3735 矩阵


    题意:有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成:
            1. g i 给i只猫咪一颗花生米
            2. e i 让第i只猫咪吃掉它拥有的所有花生米
            3. s i j 将猫咪i与猫咪j的拥有的花生米交换
            现将上述一组操作做m次后,问每只猫咪有多少颗花生?

    sol: 可参考Matrix67《十个利用矩阵乘法解决的经典题目》

                  定义初始矩阵A = [1 0 0 0],0号元素固定为1,1~n分别为对应的猫所拥有的花生数。
                  对于第一种操作g i,我们在单位矩阵基础上使Mat[0][i]变为1,例如g 1:
                  1 1 0 0
                  0 1 0 0
                  0 0 1 0
                  0 0 0 1,显然[1 0 0 0]*Mat = [1 1 0 0]
                  对于第二种操作e i,我们在单位矩阵基础使Mat[i][i] = 0,例如e 2:
                  1 0 0 0
                  0 1 0 0
                  0 0 0 0
                  0 0 0 1, 显然[1 2 3 4]*Mat = [1 2 0 4]
                  对于第三种操作s i j,我们在单位矩阵基础上使第i列与第j互换,例如s 1 2:
                  1 0 0 0
                  0 0 0 1
                  0 0 1 0
                  0 1 0 0,显然[1 2 0 4]*Mat = [1 4 0 2]
                  现在,对于每一个操作我们都可以得到一个转置矩阵,把k个操作的矩阵相乘我们可以得到一个新的转置矩阵T。
                  A * T 表示我们经过一组操作,类似我们可以得到经过m组操作的矩阵为 A * T ^ m,最终矩阵的[0][1~n]即为答案。

    PS:方法二:
                  我们还是以单位矩阵为基础:
                  对于第一种操作g i,我们使Mat[0][i] = Mat[0][i] + 1;
                  对于第二种操作e i,我们使矩阵的第i列清零;
                  对于第三种操作s i j,我们使第i列与第j列互换。
                  这样实现的话,我们始终在处理一个矩阵,免去构造k个矩阵的麻烦。

  • 相关阅读:
    5.小程序-生命周期函数
    4.小程序-路由跳转
    3.小程序-事件绑定
    2.小程序-数据绑定
    1.小程序index页静态搭建
    小程序简介
    单链表(Go)
    输入一个字符串,里面有26个英文字母和(半角逗号半角空格半角句号)按照()里的内容进行分割,遇到大写字母把其变成小写,遇到小写的将其变成大写然后输出字符串
    排序算法
    单例模式
  • 原文地址:https://www.cnblogs.com/pdev/p/4106713.html
Copyright © 2020-2023  润新知