给出p x q
尺寸矩阵,并从右上角删除尺寸为a x b
的矩阵。找到总数没有。从左上角到右下角的路径,只允许向右和向下移动。没有路径应该进入已移除的矩阵。
例如 -
_
|_|_
|_|_|
从右上角删除(2x2)
矩阵后,这是(1x1)
矩阵。没有。方式 - 5
。
我能够找出路径的总数,但是我想要消除进入被删除部分的路径的方法是非常基本的,因此效率不高。
那么,有没有更好的算法呢?
答案 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);
}