矩阵(神奇算法)

  昨晚学长教了我们这样一个神奇的算法---矩阵快速幂,矩阵快速幂在递推优化上相当神奇,并且效率很高。

 一、 先举这样一个例子。斐波那契数列大家都知道的吧。f[n]=f[n-1]+f[n+2](n=108),求f[n];

  这种题目,要是用递归做下去肯定超时。但是用矩阵就很容易解决。

   f[n]           *        0 1       =   f[n+1]

   f[n+1] ...A          1 1 ...C        f[n+2] ...B   A矩阵*C矩阵得到B矩阵。C矩阵是推出来的;主要的核心就是推出一个矩阵与A得到B矩阵。(即我知道当前状态和下一状态,我就要求出中间的媒介,这样的话就是可以无限知道下下状态,下下下状态....的值~~)我们知道f[1]=1,f[2]=1;  A*Cn=B,接着对Cn快速幂取模就OK了!

  略懂一点之后,转变一下。

  二、有a,b,c,d四个城市,如同所示。求从a->d在正好n步的条件下走到。n很大很大。求有多少种方法。 

  这个的初始的是走0步到达下一个位置的矩阵A=E(单位矩阵),然后很明显的中介矩阵就是  a b c d

                                           a 0 1 1 0

                                            b 0 0 1 1

                                            c 1 1 0 1

                                            d 0 1 1 0....C 然后A*C就可以得到走两步到一个地方的种数。其中"1"表示a->b有一种方法。

  三、依旧是有a,b,c,d四个城市,如图所示。我现在要从a到d在正好n步的条件下走到,加一个要求就是路程最短。求最短的路程。和上一个类似,这里就不进行详解了0.0

学长还讲了区域赛里的几个题目,一时半会说不清楚,从早上总结到现在,该去吃饭了==总结一下吧

矩阵快速幂主要的就是要写出那三个矩阵来解决问题,虽然现在讲的只是一种思想,里面掺杂一些动态规划的问题,不过是很实用的,可以很快速的来解决n值特别大,或者类似的组合问题。

时间: 2024-10-09 22:35:39

矩阵(神奇算法)的相关文章

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

C语言 · 矩阵相乘 · 算法提高

算法提高 矩阵相乘 时间限制:1.0s   内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的. 小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵, 要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 输入格式 输入文件共有ai+bi+2行,并且输入的所有数为整数(long long范围

下班无聊写个矩阵小算法,c#

今天是我正式成为程序员的第十天,也正式开始我的职业生涯,刚来公司要学的东西好多,既要掌握公司的框架(话说公司的框架真是太牛逼了,我真的是服了),还要学习EXT,Linq等等,对未来我是充满的希望,我希望我能成一个牛逼的系统架构师,希望通过写博客来记录我走过的每一步路,记录我的成长. 毕竟工作的时间太短了,也没什么可写的,就写两个矩阵相乘的算法吧,来开启我的博客之旅. 下面是实现的代码(是在控制台里实现的 1 public class Program 2 { 3 4 static void Mai

java 矩阵转置算法

工作中用到了行列转置,把这两种情况的算法记下来,以便后用 1.行列数相等的转置 1 /** 2 * @description 矩阵转置 3 * @author oldmonk 4 * @time 2017年8月18日 5 */ 6 public class test { 7 8 public static void main(String [] args) { 9 int data [][] = new int [] [] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8,

图像处理的神奇算法

这是利用数学算法,进行高难度图像处理的一个例子.事实上,图像处理的数学算法,已经发展到令人叹为观止的地步. Scriptol列出了几种神奇的图像处理算法,让我们一起来看一下. 一.像素图生成向量图的算法 数字时代早期的图片,分辨率很低.尤其是一些电子游戏的图片,放大后就是一个个像素方块.Depixelizing算法可以让低分辨率的像素图转化为高质量的向量图. 二.黑白图片的着色算法 让老照片自动变成彩色的算法. 三.消除阴影的算法 不留痕迹地去掉照片上某件东西的阴影的算法. 四.HDR照片的算法

矩阵应用实例及js实现矩阵转置算法

场景: 后端返回的是[['2015-1-1',1,1],['2015-1-2',1,2]]这样的Json数组,代表的意思是2015-1-1这个日期下新增的数据为1,减少的数据为1,2015-1-2这个日期,新增的数据为1,减少的数据为2,但是在统计图表上要在x轴显示时间,y轴显示新增和减少的数据这时,就要把数据转化成[['2015-1-1','2015-1-2'],[1,1],[1,2]]这样的结构,这也可以叫做矩阵的转置. 关于矩阵转置,可以用下图简单说明一下: 图片描述(最多50字) A表示

见微知著——依旧是矩阵乘法算法!

博主上大二了,接触linux自我认为还是一个有小小追求的人,觉得一直漂浮在上层没有根基,于是还是想看看linux内核,便重新看是看pointers on c扎实c语言基础.不再急功近利,不再认为看完书就学到了知识,实践出真知,自己动手才是王道.不多说,就用一个以前我写过的例子嘲讽以前的我吧! 还是一样的,pointers on c的chapter8的第五个编程小题. 函数原型 void matrix_multiply ( int *m1 , int *m2 ,int *r , int x , i

C语言 · 矩阵乘法 · 算法训练

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例输入 2 21 23 4 样例输出 7 1015 22 代码如下: #include<s

【动态规划】令你战栗的神奇算法:动态规划基础

动态规划,一种奇妙却苦涩难懂的算法,使若干小白头疼,这次小编会系统的梳理动态规划的基础. ▎什么是动态规划? 一.概念引入 1)动态规划的历史:动态规划最早是在数学领域中使用的,最常见的是在运筹学中的运用,在20世纪50年代初,美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理. 2)引入     现在思考一个问题: 有面值为1元.2元和5元的硬币若干枚,如何用最少的硬币凑够n元? 首先,我们一定会想到5元硬币面值大(利用贪心的思想),那么一定会优先使用