码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3735 矩阵

时间:2014-11-18 23:34:53      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:sp   bs   nbsp   方法   poj   br   元素   mat   基础   

题意:有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个矩阵的麻烦。

POJ3735 矩阵

标签:sp   bs   nbsp   方法   poj   br   元素   mat   基础   

原文地址:http://www.cnblogs.com/pdev/p/4106713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!