矩阵中的路径数

时间:2012-12-06 13:33:36

标签: algorithm math combinatorics

给出p x q尺寸矩阵,并从右上角删除尺寸为a x b的矩阵。找到总数没有。从左上角到右下角的路径,只允许向右和向下移动。没有路径应该进入已移除的矩阵。

例如 -

 _
|_|_
|_|_|

从右上角删除(2x2)矩阵后,这是(1x1)矩阵。没有。方式 - 5

我能够找出路径的总数,但是我想要消除进入被删除部分的路径的方法是非常基本的,因此效率不高。

那么,有没有更好的算法呢?

3 个答案:

答案 0 :(得分:9)

您可以利用网格的结构:

方形网格上从一个角到另一个角的路径数由pascal三角形的网格大小给出:(x+y) choose x

每条路径必须恰好跨越每条对角线上的一个点。

获取穿过内角的对角线上的所有点,计算通过每个点的路径数量和总和。

这导致O(min(p-a, q-b))算法假定为恒定时间算术。

在你的情况下:(通往中心的两条路径)*(从中心开始的两条路径)+(通过角落的一条路径)=(通过中心的四条路径)+(通过角落的一条路径)=(五条路径) )

+-+-+
| | |
+-+-A-+-+
| | | | |
+-B-+-+-+
| | | | |
C-+-+-+-+
| | | | |
+-+-+-+-+

  (1+2) choose 1 * (2+3) choose 2 (through A)
+ (2+1) choose 2 * (3+2) choose 3 (through B)
+ (3+0) choose 3 * (4+1) choose 4 (through C)

= 3 choose 1 * 5 choose 2
+ 3 choose 2 * 5 choose 3
+ 3 choose 3 * 5 choose 4

= 3*10
+ 3*10
+ 1*5

= 30+30+5 = 65 paths

答案 1 :(得分:6)

在表示问题的topological sort 1 上执行DAG

然后从最后一个(接收器)迭代到第一个(源):

f(v) = Sum(f(u)) for each (v,u) in E
base: f(sink) = 1

复杂度在图形的大小上是线性的(每个顶点只迭代一次)(使用矩阵的维度O(p*q-a*b)


(1)图G =(V,E)是:

V = { (i,j) | for each i,j in the matrix that was not deleted }
E = { ((i1,j1),(i2,j2)) | (i1,j1) is to the left/up of (i2,j2) }

答案 2 :(得分:0)

//assume we are moving from m,n to 1,1
int  numberOfPaths(int m, int n)
{
/*If the m,n  is left-bordered to the removed matrix, then move only downwards 
  till the end of removed matrix,then we can move in two directions*/
 //l1=numberOfrows(bigMatrix)-numberOfRows(smallMatrix), similarly l2 for columns
 if(m==l1&&n>=l2)
   return numberOfPaths(l1-1,l2+2)+numberOfPaths(l1,l2+1);
// If either given row number is first or given column number is first
if (m == 1 || n == 1)
    return 1;

 return  numberOfPaths(m-1, n) + numberOfPaths(m, n-1); 
}