路徑數的計算

2021-04-13 23:22:40 字數 3322 閱讀 6150

問題:編制程式,計算從點a(0,0)到點b(m,n)的路徑數。行走方向只能向上或向右。

+--+--+--+--+--+b(m,n)

|  |  |  |  |  |

+--+--+--+--+--+

|  |  |  |  |  |

+--+--+--+--+--+

|  |  |  |  |  |

+--+--+--+--+--+

a(0,0)

一條從a到b的路徑將有m次向右行走和n次向上行走。如果將向右行走標記為0,將向上行走標記為1,則一條從a到b的路徑對應乙個長度為m+n的0-1串,其中含m個0和n個1,例如,下面的路徑

+--+--+--+--****b(m,n)

|  |  |  |  *  |

+--+--+--+--*--+

|  |  |  |  *  |

+--**********--+

|  *  |  |  |  |

****--+--+--+--+

對應的0-1串為:01000110

因此,路徑數=長度為m+n的0-1串的個數(m個0,n個1),其值為(m+n)!/m!n!,即c(m+n,m)(表示乙個二項式係數)。

這裡我們考慮一下路徑數的遞推計算方法:一條從a到b的路徑必經p(m-1,n)及q(m,n-1)之一

p(m-1,n)

+--+--+--+--*--+b(m,n)

|  |  |  |  |  |

+--+--+--+--+--*q(m,n-1)

|  |  |  |  |  |

+--+--+--+--+--+

|  |  |  |  |  |

+--+--+--+--+--+

記從(0,0)到(m,n)的路徑數為path(m,n),由加法原理,

path(m,n)=path(m-1,n)+path(m,n-1)  (m,n>0)

且path(0,n)=path(n,0)=1 (n>=0)

由此可得下面的計算程式:

for (y=0; y<=n; y++)

path[0][y]=1;

for (x=1; x<=m; x++)

用乙個二維陣列,可以計算出(0,0)到(m,n)的路徑數。

~~~~~~~~~~

觀察從x列推進到x+1列時的遞推格式:

path[x][n] ---> path[x+1][n]a|

path[x][n-1] ---> path[x+1][n-1]a|

path[x][n-2] ---> path[x+1][n-2]a|

...a

|path[x][2] ---> path[x+1][2]a|

path[x][0] ---> path[x+1][1]a|

path[x][1] ---> path[x+1][0]

由於計算path[x+1][k]時只需要用到path[x][k]及path[x+1][k-1]的值,即path[x+1][k]只用到第x行乙個值,且該值在遞推第x+1行的過程中僅僅用到一次,因此,我們可以只用乙個一維陣列p來進行路徑數的計算,開始時,該陣列儲存x=0列的所有路徑數

for (y=0; y<=n; y++)

path[y]=1;

在從第x列遞推到第x+1列時,我們從y=0到n進行遞推,當y=0時,path[y]的值不變,而當y>0時有:

for (y=1; y<=n, y++)

path[y] += path[y-1];

這樣,按上述遞推關係推經到x=m的行後,path[n]即為路徑數。

完整的演算法為:

for (y=0; y<=n; y++)

path[y]=1;

for (x=1; x<=m; x++)

for (y=1; y<=n, y++)

path[y] += path[y-1];

演算法的時間複雜性為o(mn)。

~~~~~~~~~~

利用上述遞推計算的思想,可以解決一些趣味數學中的問題,例如:

問題一、計算下圖中從a到b的路徑數。

+--+--+--+--+--+b(m,n)

|  |  |  |  |  |

+--+--+--+--+--+

|  |        |  |

+--+        +--+

|  |        |  |

+--+        +--+

|  |        |  |

+--+--+--+--+--+

|  |  |  |  |  |

+--+--+--+--+--+

a(0,0)

利用基本遞推關係,可以得到:

1--6--11-16-26-52

|  |  |  |  |  |

1--5--5--5--10-26

|  |        |  |

1--4        5--16

|  |        |  |

1--3        5--11

|  |        |  |

1--2--3--4--5--6

|  |  |  |  |  |

1--1--1--1--1--1

問題二、計算下圖中從a到b的路徑數

+---+---+---+---+---+b

|   |   |   |   |   |

+---+---+---+---+---+

|   |   |   |   |   |

+---+---+---+---+---+---+---+---+

|   |   |   |   |   |

+---+---+---+---+---+

|   |   |   |   |   |

+---+---+---+---+---+

|   |   |   |   |   |

+---+---+---+---+---+

a同樣利用基本的遞推關係可以得到:

20--75--186-353-576-855

|   |   |   |   |   |

20--55--111-167-223-279

|   |   |   |   |   |

1---4---10--20--35--56--56--56--56

|   |   |   |   |   |

1---3---6---10--15--21

|   |   |   |   |   |

1---2---3---4---5---6

|   |   |   |   |   |

1---1---1---1---1---1

關鍵路徑的計算

從源點到匯點路徑長度最長的路徑為該project的關鍵路徑,即關鍵路徑可以保證全部路徑的活動都可以完畢。ok,再次進入我們的作業題 例如以下圖所看到的的aoe網 弧上權值代表活動的持續天數 1 完畢此project最少所須要多少天?2 哪些是關鍵活動,在圖中表示出關鍵路徑 我們先計算最早發生時間ve...

關鍵路徑的計算

全知識整理目錄 資料結構整理的目錄包括了許多的資料結構相關知識。目錄概述 例題1例題2 關鍵路徑是用來衡量,工程當中,最長完成時間的,所以v e 最早開始時間,v l 最晚開始時間。v e 最短的執行時間路徑,v l 最大時間 多完成時間。下面以兩個例題來講解,關鍵路徑是如何計算的。2021.10....

計算路徑a對於路徑b的相對路徑

csdn的這個格式實在dt 計算路徑a對於路徑b的相對路徑 author wusuopubupt date 2013 08 01 dira a e.php dirb a b f e g.php explode directions arr dira explode dira arr dirb exp...