dp 优化

· · 个人记录

dp 优化

dp 优化基础理论

用动态规划解决问题具有空间耗费大、时间效率高的特点,但也会有时间效率不能满足要求的时候,如果算法有可以优化的余地,就可以考虑时间效率的优化。

DP高时间效率的关键在于它减少了“冗余”,即不必要的计算或重复计算部分,算法的几余程度是决定算法效率的关键。而动态规划就是在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少“冗余”。但是,一个动态规划问题很难做到完全消除“冗余”。

下面给出一般动态规划影响时间复杂度的三个因素:

\text{时间复杂度}=\text{状态总数}\times\text{每个状态转移的状态数}\times\text{每次状态转移的时间}

所以优化 dp 也通常可以从这三个方向入手。

关于“状态”的优化可以从很多角度出发,思维难度较高,有时候状态选择的好坏会直接导致算法在很大程度上的优劣。

dp 状态设计的优化,一般来讲都是优化状态的总数。当然为了方便决策与转移而重新设计状态也是可能的。令人遗憾的是,这类优化大多不具有通用性,优化方法因题而异,此处仅仅抛砖引玉,希望能给大家带来一定的启发。

矩阵优化 dp

矩阵的乘法是向量内积的推广。

矩阵相乘只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。

AP\times M的矩阵,BM\times Q 的矩阵,设矩阵 C 为矩阵 AB 的乘积,其中矩阵 C 中的第 i 行第 j 列元素可以表示为:

C_{i,j}=\sum^M_{k=1}\,A_{i,k}\,B_{k,j}

矩阵乘法满足结合律,不满足一般的交换律。

利用结合律,矩阵乘法可以利用快速幂的思想来优化。

在比赛中,由于线性递推式可以表示成矩阵乘法的形式,也通常用矩阵快速幂来求线性递推数列的某一项。

F(k)=\left|\begin{array}{cccc} f_{k}(1,1) & f_{k}(1,2) & \ldots & f_{k}(1, n) \\ f_{k}(2,1) & f_{k}(2,2) & \ldots & f_{k}(2, n) \\ \ldots & \ldots & \ldots & \ldots \\ f_{k}(n, 1) & f_{k}(n, 2) & \ldots & f_{k}(n, n) \end{array}\right|

数据结构优化 dp