• 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个矩阵的麻烦。

  • 相关阅读:
    驱动函数write-linux系统调用如何实现?
    ubus应用-第三篇blob数据
    ubus应用-第二篇ubus代码应用
    uci基本应用法
    request 请求大数精度丢失问题
    List.remove()踩坑记录
    The app delegate must implement the window property
    关于版本号
    iOS 中拨打电话
    使用python 快速搭建一个静态服务器
  • 原文地址:https://www.cnblogs.com/pdev/p/4106713.html
Copyright © 2020-2023  润新知