矩阵从左上到右下导航,只向右或向下移动?

时间:2014-01-20 04:36:45

标签: c algorithm matrix

实际问题就像我从在线比赛中得到的那样。我解决了它,但我的解决方案,在C中,无法及时为大数字产生答案。我需要在C中解决它。

以下是英语词典中的一个单词,排列为矩阵:

MATHE
ATHEM
THEMA
HEMAT
EMATI
MATIC
ATICS

跟踪矩阵从左上角开始,每步向右或向下移动,到达矩阵的右下角。确保任何此类跟踪都生成相同的单词。对于长度为m + n-1的给定单词写成大小为m * n的矩阵,可以进行多少次这样的描记?

1≤m,n≤10^ 6

我必须按照问题陈述中的说明打印单词可以跟踪的方式。如果数字大于10 ^ 9 + 7,我必须打印S mod(10 ^ 9 + 7)。

在测试用例中,m和n可能非常大。

3 个答案:

答案 0 :(得分:1)

想象一下遍历矩阵,无论你选择哪条路径,都需要花费n + m-2步骤来制作这个词,其中n-1是向下而m-1是向右,它们的顺序可能会改变但是数字n-1和m-1保持相同。因此问题减少到只选择n + m-2中的n-1个位置,所以答案是

  

C(N + M-2,N-1)= C(N + M-2,M-1)

如何计算此问题的C(n,r):

你必须知道如何在模块化算术中乘以两个数字,即

(a*b)%mod=(a%mod*b%mod)%mod

现在要计算C(n,r)你还需要除法,但模数运算中的除法可以通过使用数字的模乘法逆来执行,即

((a)*(a^-1))%mod=1

当然,模数运算中的^ -1不需要等于1 / a,并且可以使用扩展欧几里得算法计算,因为在你的情况下mod是素数因此

(a^(-1))=a^(mod-2)%mod

a ^(mod-2)可以使用重复平方法有效地计算。

答案 1 :(得分:0)

我建议对这个问题采用动态编程方法,因为计算大数的阶乘会涉及很多时间,特别是因为你有多个查询。

从一个小矩阵(比如2x1)开始,继续寻找更大矩阵的解决方案。请注意,此解决方案的工作原理是,在找到更大矩阵的解决方案时,您可以使用为较小矩阵计算的值,并加快计算速度。

上述解决方案IMO的复杂性是MN矩阵的MxN多项式。

答案 2 :(得分:0)

使用拉普拉斯的三角形,错误地命名为“二项式”

1  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0

1  1  0  0  0
1  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0

1  1  1  0  0
1  2  0  0  0
1  0  0  0  0
0  0  0  0  0
0  0  0  0  0

1  1  1  1  0
1  2  3  0  0
1  3  0  0  0
1  0  0  0  0
0  0  0  0  0

1  1  1  1  1
1  2  3  4  0
1  3  6  0  0
1  4  0  0  0
1  0  0  0  0

1  1  1  1  1
1  2  3  4  5
1  3  6 10  0
1  4 10  0  0
1  5  0  0  0

1  1  1  1  1
1  2  3  4  5
1  3  6 10 15
1  4 10 20  0
1  5 15  0  0

1  1  1  1  1
1  2  3  4  5
1  3  6 10 15
1  4 10 20 35
1  5 15 35  0

1  1  1  1  1
1  2  3  4  5
1  3  6 10 15
1  4 10 20 35
1  5 15 35 70

知道了吗?请注意,元素可以计为二项式成员。 diag成员在这里:C ^ 1_2,C ^ 2_4,C ^ 3_6,C ^ 4_8等。选择你需要的。