本贴声明:
关于这道题的基本解法, 我在之前曾经发表过, 以动态规划的方式在O(N)的时间复杂度内求解, 但对于数据规模为10^9的数据而已, O(N)显然是不够的, 当时我受困良久. 但幸运的是, 某网友给了我一个万分有用的建议, 以矩阵的方式的进行求解. 当我实现以后, 我发现这是一个O( log(2)(N) )[注: 以2为底N的对数 ]的算法, 速度之快, 毋庸置疑.
这道题的矩阵解法, 其核心理论依然依靠于基本的动态规划解法, 然后再配合上线性代数中的矩阵加以优化, 如果读者不了解此题的动态解法, 那么以下解释无疑相当于看天书, 所以, 我建议读者在阅读下文之前, 先阅读我以前写的叠骰子 --- 动态规划解法的解题报告,然后, 如果你没有线性代数的基础知识, 也是不行的,最起码的, 你应该对矩阵的乘法规则有一定程度的了解, 最后, 你还应该熟悉快速幂的原理, 如果你具备上述的三项基础知识, 那么我们可以接着看下去了.
线性组合的奇妙:
在讲如何用矩阵来优化动态规划算法之前, 我先引入一个新的例子来表达矩阵乘法的奇妙之处. 相信大家都曾经接触过斐波那契数列,数列定义如下:
1) F(0) = 0, F(1) = 1;
2) F(n) = F(n-1) + F(n-2); [ n > 1 ]
相信但凡学过递归的同学都接触过该数列, 但是我们一般的解法都是以带记忆数组的递归来求解, 不过, 这个很特别的数列确是可以以矩阵来求解的, 看看下面的矩阵递归式: