编程-从矩阵左上角走到右下角

本文介绍了一种使用动态规划算法解决从矩阵左上角到右下角的最短路径问题。通过建立状态转移方程stat[i][j] = min{stat[i-1][j], stat[i][j-1]},并使用一个额外的direct矩阵记录路径方向,可以计算出最小权值和路径。在非负矩阵中,通过遍历和更新stat及direct矩阵,最终确定最短路径及其权值。" 122147093,10557706,网络安全基础:ISO/OSI与TCP/IP模型与安全问题,"['网络', '安全', 'Web安全', 'TCP/IP', 'OSI模型']
摘要由CSDN通过智能技术生成

题目要求:
编写一个算法,在非负矩阵中,从左上角走到右下角,每次只能向左或向下移动一格,输出走过的路径节点坐标和最小权值。
方法:动态规划法
状态转移方程stat[i][j] = min{stat[i-1][j], stat[i][j-1]}。
逻辑:目的节点是从其上边节点或左边节点下来的,判断上边节点和左边节点哪个小,就是从哪个节点下来的,并用一个direct矩阵记录所来方向,若该节点是从上边节点下来的,就将direct矩阵该节点定为1,否则定为0。
非负矩阵名字定义为matrix,这个matrix矩阵有两条特殊路径,即第一行和第一列,因为第一行的所有节点只能从它左边节点走过来的,而第一列的所有节点都是从它上一个节点走过来的。这样,就能得到第一行每个节点到左上角节点的权值和第一列每个节点到左上角节点的权值。
比如:
(0, 0)(0,1)(0, 2)
(1, 0)(1,1)(1,2)
(2,0)(2, 1)(2,2)
对应的权值为:
1 2 3
4 5 6
2 3 5
节点(0,0)为起始点,节点(2,2)为终止点,从起始点到节点(0,1)的总权值为(0,0)的权值加上(0,1)的权值,从起始点到(0,2)的总权值为(0,0)的权值加上(0,1)的权值加上(0,2)的权值。同理可得(1,0)到起始点的总权值,(2,0)到起始点的总权值。
得到的stat表为
1 3 6
5
7
而(1,1)节点到起始点有两个方向,一个是它的上边,即(0,1)点,一个是它的左边(1,0)点,通过stat表可知,(0,1)点的总权值为3,(1,0)点的总权值为5,因为要获得最短路径,所以我们选最小的权值3在加上当前节点的权值就是当前节点到启始节点的总权值,即为8。为了记录当前权值是从它上边走过来的还是从它左边走过来的,我们还第一了一个direct矩阵,初始化后的direct矩阵为:
0 1 1
0
0
其中,1表示该节点是从它的左边走过来的,0表示该节点是从它上边节点走过来的,在修改stat矩阵时,也应该修改direct矩阵。经过两层循环,就能填充stat矩阵和direct矩阵,填充满后的stat矩阵和direct矩阵为:
stat矩阵:
1 3 6
5 8 12
7 10 15
direct矩阵:
0 1 1
0 0 0
0 1 1
stat矩阵的终止顶点中的权值就是最短路径的权值。
根据direct矩阵,我们能够得到目的顶点(2, 2)是从它左边顶点(2,1)走过来的,因为当前direct值为1(表示从当前顶点左边走过来),而(2,1)是从它左边顶点(2,0)走过来的,而(2,0)是从它上边顶点(1,0)走过来的,而(1,0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值