将k个不相交路径放在n×m矩阵中的方法有多少

时间:2014-03-03 20:14:33

标签: algorithm

所以我有一个n x m矩阵。我需要找出有多少种不同的方法可以在这个矩阵上放置k不相交的路径。每条路径都满足这些条件:

- 从第一栏开始。

- 在最后一个结束。

- 如果路径在(a,b)b<m结束,则下一步只能在网格(a',b+1)上,其中|a'-a|<=1(意味着我沿着对角线向下移动一步,元组中的第一个是x坐标,第二个是y坐标。

- 我知道n很小(比如说8),所以它并没有太多破坏算法的复杂性。

明显的暴力方法(以递归方式探索所有可能的选项)是正确的,但因为m可能非常大,所以在这里没用。

我遇到的极端麻烦在于考虑这些不相交的道路。对于k=1来说,事情会很简单。我们将数组的每个元素与结束的路径数相关联,并使用以下公式tab[m][n]=tab[m-1][n-1]+tab[m-1][n+1]递归计算它。但是什么时候k=2?我认为如果我可以解决这个问题,我可以轻松地将其扩展为更大的k,但我在考虑成本不是指数级的算法时遇到了麻烦。

1 个答案:

答案 0 :(得分:1)

我无法建立一个非指数的算法,但至少我相信我可以概括k> = 2的问题,只要k小于n且n相对较小(比如8)

假设我们正在观察一个8行M列矩阵,其中M很大,你需要适应从左到右一直摆动的k个路径。

可以使用C(8,k)可能的配置绘制单个列,最大值约为70。 您应该能够进一步建立70x70矩阵,表明每个配置可以连续到其他列配置,遵守您的路径规则。

上面的矩阵实际上是70个顶点上的非方向图。

现在问题已转变为在图中找到所有M长度路径。

进一步编辑:如果您只想获得可能的M列配置的总数,可以使用多项式算法,如下所示:

考虑已经获得以下内容:

N-1列配置的总计数,其中计数根据最后的列配置求和(例如,5个配置以config1结束,46个以config2结束,等等...... 28以配置70结束)。这可以用数组或哈希表来表示

使用70x70矩阵,您可以轻松地为N列配置派生下一个数组。

因此,上面形成了一个多项式时间算法,用于计算M列配置的总数。你只需要从N = 1

开始