所以我有一个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
,但我在考虑成本不是指数级的算法时遇到了麻烦。
答案 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
开始