[推荐]数阵中的最优路径
来源:互联网 发布:淘宝咸鱼网 编辑:程序博客网 时间:2024/05/15 00:41
一、数值三角形中的最大路径
随机产生一个n行的点数值三角形(该数值三角形的第K行有K个点,每一个点都带有一个正整数),如图所示,即随机产生一个7行点数值三角形。寻找从顶点开始每一步可沿左斜(L)或右斜(R)向下直至底部的一条路径,使该路径所经过的点的数值和最大。
16
12 13
8 12 7
14 9 17 5
6 18 18 13 13
11 8 8 3 15 8
7 1 18 5 2 17 19
二、数值三角形中的最大路径搜索
应用动态规划,采用逆推法即从底向上逐行反推。
随机产生的点数值三角形的数值在二维数组a(n, n)中,同时赋给b(n, n)。 这里数组b(i, j)为点i(i, j)到底的最大数组和,stm(i,j)是点(i,j)向左或向右的路标字符数组,实施逆推法,知b(i,j)与stm(i,j)(i=n-1,...,2,1)的值由b的第i+1行的值决定:
若b(i+1, j+1) > b(i+1, j),则
b(i, j)=b(i,j)+b(i+1,j+1);stm(i,j)="R"
若b(i+1,j+1) <= b(i+1,j),则
b(i, j)=b(i,j)+b(i+1,j); stm(i,j)="L"
这样所得b(1,1)即为所示的最优路径数值和。
为了打印最优路径,利用stm数组从上而下查找:先打印a(1,1),若stm(1,1)='R',则下一个打印a(2,2),否则打印a(2,1)。一般地,对i=2,3,...,n:
若stm(i-1, j)="R",则打印“-R”;a(i,j+1);同时赋值j++。
若stm(i-1, j)="L",则打印"-L-";a(i,j);
依此打印出最大路径。
三、代码实现
四、数值矩阵中的最小路径搜索
问题描述:随机产生一个n行m列的整数矩阵,如图所示即随机产生的一个7行5列的数值矩阵,在整数矩阵中寻找从左上角至右下角,每步可向下(D)或向右(R)或斜向右下(O)的一条数值和最小的路径。
27 28 29 18 26
16 13 19 14 27
32 22 39 26 21
10 30 23 20 18
13 11 30 29 20
10 13 21 17 36
34 37 15 22 36
设计要点:应用动态规划设计,即从右下角逐行反推左上角。确定n、m后,随机产生的整数二维数组a(n,m)作矩阵输出,同时赋给部分和数组b(n, m)。
这里数组b(i,j)为点(i,j)到右下角的最小数值和,stm(i,j)是点(i,j)向右(R)或向下(D)或向右下(O)的路标字符数组。
注意到最后一行与最后一列各数只有一个出口,于是由b(n,m)开始向左逐个推出同行的b(n,j)(j=m-1,...,2,1);向上逐个推出同列的b(i,m)(i=n-1,...,2,1)。
b(i,j)与stm(i,j) (i=n-1,...,2,1; j=m-1,...,2,1)的值由同一列其下面的整数b(i+1,j)与同一行其右边的整数b(i,j+1)或其右下方的b(i+1,j+1)的值决定:
设min=min(b(i+1,j+1),b(i,j+1),b(i+1,j);
首先,作赋值min=b(i+1,j+1),stm(i,j)="O";
若b(i,j+1)<min,则min=b(i,j+1),stm(i,j)="R";
若b(i+1,j)<min, 则min=b(i+1,j),stm(i,j)="D"。
然后赋值:b(i,j)=b(i,j)+min。
这样反推所得b(1,1)即为所求的最小路径数字和。
为了打印最小路径,利用c数组从上而下操作:先打印a(1,1), i=1, j=1.
①若stm(i,j)="R",则j++,然后打印"-R-"与右边的整数a(i,j)。
②若stm(i,j)="D",则i++,然后打印"-D-"与下面的整数a(i,j)。
③若stm(i,j)="O",则i++,j++,然后打印"-O-"与斜右下的整数a(i,j)。
依次类推,直到打印到点a(n,m)。
代码实现:
转自《趣味C程序设计集锦》
- [推荐]数阵中的最优路径
- csu 1106 最优对称路径(最短路+路径数)
- 数塔 最优路径问题 -- (第九题)
- 【推荐】HibernateUtil 最优写法
- 最优估计书籍推荐
- 实时路况分析:不同路段车速预测、推荐(距离、时间、路况)最优路径
- C的最优路径
- 最优对称路径
- 矩阵最优路径
- 迷宫求解最优路径
- mod4最优路径问题
- 最优对称路径
- 最优对称路径
- 迷宫的最优路径
- Dijastra最优路径算法
- 打印最优路径
- 最优对称路径
- 最优对称路径 CSU
- 雨中
- android模拟器操作
- 关于FFMPEG + Live555 = H.264的问题[
- Java 值传递与引用传递
- 云计算
- [推荐]数阵中的最优路径
- Java泛型-类型擦除
- 吉他新手初练曲
- 秋茌
- Algorithm Visualization of USFCA
- String和StringBuffer的效率
- Python模块学习 ---- threading 多线程控制和处理
- 应用HttpClient来对付各种顽固的WEB服务器
- char *和const char *