首页 > 代码库 > 矩阵!!
矩阵!!
今天师兄被老廖喊着来给我们讲经验总结,他讲的矩阵,这东西从前听了就怕,碰都不想碰,今天接触了一下,哟,这个feel倍儿爽!
矩阵用来解决问题往往有意想不到的效果!
第一个例子,斐波那契数列,大家不陌生吧?F[N]=F[N-1]+F[N-2];要你求F[N],其中N很大,大到1E10,大哥们,有木有蛋疼的?当时我也碰到过这样的题目,不过被我默默滴越过去了- -!现在好了,听了这个矩阵的做法,尼玛,还真是很好解决啊!
建立这样一个矩阵A
| F[N-2] |
| F[N-1] |
然后要求出来的是这样一个矩阵B
| F[N-1] |
| F[N] |
然后推出一个与第一个矩阵相乘等于第二个矩阵的矩阵C
| 0 1 |
| 1 1 |
矩阵乘法我可就不详细说了啊,自己弄明白再来学这个— —!
应用以上这点信息可以建立公式
AxC=B
我们很容易知道F[1]、F[2]的,作死滴诚意C不就可以得到想要的了么?
AxC^N=B
然后对于C用快速幂取模算法处理,不就很快了?
下面是学长的第二个例子,我记得好像是那个路径问题
题目:给你地图map[ ][ ],要你求出从A走K步走到B的方案数。
尼玛,坑爹哦,记得杭电那个题不?就是正好要一定步数走到终点才行,题号我倒是忘记了,嘎嘎!
用我们一般做题的想法来做的话还真是会麻烦到死,麻烦就算了,代码敲起来如果思维不清晰,一下子就晕死在河边上,你就作死的纠结去吧,下面说说用矩阵来做吧!
地图是用二维矩阵装的,那就直接用它做文章,假设输入是这样的,a b表示a到b有一条通路
输入:(4*4的地图)
1 2
1 3
2 3
2 4
3 4
于是就有了map[ ][ ]:
| 0 1 1 0 |
| 1 0 1 1 |
| 1 1 0 1 |
| 0 1 1 0 |
map[X][Y]=1表示X和Y之间有通路
如果直接用map X map呢?
就拿求出的矩阵的第一行第一列结果的由来来说,它是由第一行乘以第一列得来的,什么含义咧?首先是看行,表示的是城镇1能去的城镇,而从列来看,表示的是能够来1城镇的城镇,所以能否看出“x行y列结果就是x去y的方案数,每次乘以矩阵map就等于走两步”?
我有我自己的理解,《从i去j经过k》,相乘中取用 i 行中那个 i 就是起点,取用的 j 列就是终点,k就是 i 行中的各个 j ,比如上面的第一行第一列就是从1去1分别经过2,3两个点,这样能懂不?不懂就再看一遍,如果还是不懂我就告诉你,你有点蠢!
这种方法还能求最短路,本来是行列各个单元相乘的结果相加就是求这个方案数,现在不相加,直接取最小的那个,好好想想,是不是最短路了??嘎嘎
哎呀,写得手冷死了,快抽经了,还有三个例子吧,那才是精华,但是三言两语说不清楚,又不像斗鱼里面还有人送鱼丸,尼玛,还鱼丸咯,鱼刺都毛有一根,得了,说说总结吧,我觉得我的总结绝对不是一无是处的!
总结:我觉得用矩阵的想法来解决问题能够体现比别的快的方面就在于矩阵相乘。当然矩阵解决问题只是一个思想,就跟DP一样,说不清楚的,面对问题,感觉要用矩阵来解决的话,首先你要摸索怎么建模,建模的基础就是“状态”,从状态A变更到状态B这个过程中得出的A与B之间的关系,然后建立矩阵,不知道别人是怎么解题的,我是今天才接触的,但是我摸索着来的话我会先建立“起点”和“终点”,然后求中间矩阵K。矩阵的应用很灵活,没人能完全说清楚,所以我说的也是有错的,麻烦纠正哈,不要含羞,放下你的矜持来批斗我,就像对着禽兽喊:“放开那妹子,有事让我来”一样!
矩阵!!