7

给定一个 p x q大小矩阵,a x b从右上角移除一个大小矩阵。找到总数。从左上角到右下角的路径,只允许向右和向下移动。任何路径都不应进入已删除的矩阵。

例如-

 _
|_|_
|_|_|

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

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

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

4

3 回答 3

9

您可以利用网格的结构:

正方形网格上从一个角到另一个角的路径数由帕斯卡三角形的网格大小给出:(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
于 2012-12-06T13:50:24.217 回答
6

对代表问题的DAG 1进行拓扑排序。

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

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) }
于 2012-12-06T13:40:12.363 回答
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); 
}
于 2015-04-06T17:05:07.377 回答