zoukankan      html  css  js  c++  java
  • 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个矩阵的麻烦。

  • 相关阅读:
    Hadoop--单点故障修复
    Hadoop---静动态增删节点
    sqlserver 通知应用程序(存储过程通过http调用接口)
    sqlserver 资源等待
    sqlserver 性能优化
    sqlserver 资源等待
    sqlserver 查看内存情况
    sqlserver动态管理视图
    常见散列算法
    sqlserver 性能检测 和 监控
  • 原文地址:https://www.cnblogs.com/pdev/p/4106713.html
Copyright © 2011-2022 走看看