矩阵!!

   今天师兄被老廖喊着来给我们讲经验总结,他讲的矩阵,这东西从前听了就怕,碰都不想碰,今天接触了一下,哟,这个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。矩阵的应用很灵活,没人能完全说清楚,所以我说的也是有错的,麻烦纠正哈,不要含羞,放下你的矜持来批斗我,就像对着禽兽喊:“放开那妹子,有事让我来”一样!




### 回答1: 题目要求编写一个程序,输入一个5行5列的整数矩阵,判断该矩阵是否为对称矩阵,是则输出“该矩阵是对称矩阵!”,否则输出“该矩阵不是对称矩阵!”。对称矩阵的定义是该矩阵的定义是所有对称元素位置对应的值相等。即矩阵第i行第j列元素等于第j行第i列元素的值。 ### 回答2: 解题思路: 根据对称矩阵的定义,我们可以通过检查矩阵是否满足第i行j列元素值等于第j行i列元素值的条件来判断该矩阵是否为对称矩阵。具体实现步骤如下: 1. 首先要从用户输入中获取5行5列的整数矩阵,可以使用嵌套循环遍历二维数组,每次输入一个元素并存储在对应位置上。 2. 接着,我们需要检查该矩阵是否满足对称矩阵的条件,可以使用一个嵌套循环遍历整个矩阵,对于每一个元素,我们都判断它与对应位置上的元素是否相等,如果不相等,则说明该矩阵不是对称矩阵,直接输出结果并结束程序。 3. 如果程序成功检测出该矩阵为对称矩阵,则输出“该矩阵是对称矩阵!”的提示信息。 4. 最后,我们需要释放内存,并返回程序结束。 编写代码: #include <stdio.h> int main() { int i, j, matrix[5][5]; // 输入矩阵元素 printf("请输入5行5列的整数矩阵:\n"); for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { scanf("%d", &matrix[i][j]); } } // 判断矩阵是否为对称矩阵 for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (matrix[i][j] != matrix[j][i]) { printf("该矩阵不是对称矩阵!\n"); return 0; } } } // 输出结果 printf("该矩阵是对称矩阵!\n"); return 0; } 运行代码: 现在我们可以运行代码,测试是否按照预期输出结果。 请输入5行5列的整数矩阵: 1 2 3 4 5 2 1 0 5 6 3 0 1 9 7 4 5 9 1 3 5 6 7 3 1 该矩阵不是对称矩阵! 结果显示矩阵不是对称矩阵,因为第1行2列元素的值为2,但第2行1列元素的值为5,它们不相等。接着我们再测试一组数据,这次输入的矩阵是对称矩阵。 请输入5行5列的整数矩阵: 1 2 3 4 5 2 0 0 5 6 3 0 1 9 7 4 5 9 1 3 5 6 7 3 1 该矩阵是对称矩阵! 结果显示矩阵是对称矩阵,符合预期。 ### 回答3: 对称矩阵是指矩阵中所有第i行j列的元素值等于第j行i列元素的值。因此,我们可以编写一个程序来判断输入的矩阵是否是对称矩阵。 首先,我们需要输入一个5行5列的整数矩阵,并将其存储在一个二维数组中。 然后,我们需要定义一个函数来检查该矩阵是否是对称矩阵。该函数将接受矩阵作为参数,并返回一个布尔值。 在该函数中,我们将遍历矩阵的所有元素,并检查其是否对称。如果每个元素都对称,则该矩阵是对称矩阵,并返回true。否则,该矩阵不是对称矩阵,则返回false。 最后,在主程序中调用该函数来检查输入的矩阵是否对称。如果该矩阵是对称的,则输出“该矩阵是对称矩阵!”,否则输出“该矩阵不是对称矩阵!”。 下面是一个示例程序: ```python def is_symmetric(matrix): for i in range(len(matrix)): for j in range(i, len(matrix)): if matrix[i][j] != matrix[j][i]: return False return True matrix = [[0 for j in range(5)] for i in range(5)] for i in range(5): row = input("请输入第%d行的5个整数,用空格隔开:" % (i+1)) nums = row.split() for j in range(5): matrix[i][j] = int(nums[j]) if is_symmetric(matrix): print("该矩阵是对称矩阵!") else: print("该矩阵不是对称矩阵!") ``` 在该示例程序中,我们首先定义了一个名为`is_symmetric`的函数,用于检查输入的矩阵是否是对称矩阵。 然后,我们提示用户输入一个5行5列的整数矩阵,并将其存储在一个名为`matrix`的二维数组中。 最后,我们调用`is_symmetric`函数来检查输入的矩阵是否是对称的,并输出相应的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值