【问题标题】:Navigation of matrix from left top to right bottom, only moving to the right or downwards?矩阵从左上到右下导航,只能向右或向下移动?
【发布时间】:2014-01-20 04:36:44
【问题描述】:

实际问题是这样的,我从在线比赛中得到。我解决了它,但我的 C 语言解决方案无法及时为大量数字提供答案。我需要用 C 来解决它。

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

MATHE
ATHEM
THEMA
HEMAT
EMATI
MATIC
ATICS

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

1 ≤ m,n ≤ 10^6

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

在测试用例中,m 和 n 可以很大。

【问题讨论】:

    标签: c algorithm matrix


    【解决方案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

    当然,模算术中的 a^-1 不必等于 1/a,并且可以使用扩展欧几里得算法计算,因为在您的情况下 mod 是一个素数

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

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

    【讨论】:

    • 我知道这个解决方案,但是我如何计算大数的阶乘,例如 50 或 100 在问题中提到它可以达到 10^6。
    • 你能解释一下如何 (a^(-1))=a^(mod-2)%mod .
    • @vj1207 它是模算术中的一个属性。
    【解决方案2】:

    我建议使用动态编程方法来解决这个问题,因为计算大数的阶乘需要很多时间,尤其是当您有多个查询时。

    从一个小矩阵(比如2x1)开始,不断寻找更大矩阵的解决方案。请注意,此解决方案有效,因为在寻找更大矩阵的解决方案时,您可以使用针对较小矩阵计算的值并加快计算速度。

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

    【讨论】:

      【解决方案3】:

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

      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
      

      明白了吗?请注意,元素可以算作二项式成员。诊断成员在这里:C^1_2、C^2_4、C^3_6、C^4_8 等等。选择您需要的。

      【讨论】:

      • 我知道它就像帕斯卡三角形,但上面问题中的行和列可能并不总是相同的。
      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多