[推荐]数阵中的最优路径

来源:互联网 发布:淘宝咸鱼网 编辑:程序博客网 时间: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程序设计集锦》