状态与状态转移方程

状态与状态转移方程

在之前的两节中已经讨论了两类较为经典的动态规划问题的解法,本节将对两种算法进行总结,并探讨解动态规划问题的统一思路。

回顾两种经典问题的算法模式,都先定义了一个数字量,如最长递增子序列中用dp[i]表示以序列中第i个数字结尾的最长递增子序列长度和最长公共子序列中用 dp[i][j]表示的两个字符串中前 i、j 个字符的最长公共子序列,就是通过对这两个数字量的不断求解最终得到答案的。这个数字量就被称为状态。

状态是描述问题当前状况的一个数字量。首先,它是数字的,是可以被抽象出来保存在内存中的。其次,它可以完全的表示一个状态的特征,而不需要其他任何的辅助信息。最后,也是状态最重要的特点,状态间的转移完全依赖于各个状态本身,如最长递增子序列中,dp[x]的值由 dp[i](i < x)的值确定。若在分析动态规划问题的时候能够找到这样一个符合以上所有条件的状态,那么多半这个问题是可以被正确解出的。这就是为什么人们常说,做 DP 题的关键,就是寻找一个好的状态。

将注意力放到状态的递推过程中来,由一个或多个老的状态得出一个新的状态的过程,被称为状态的转移。如最长公共子序列中,通过 dp[i - 1][j - 1]dp[i][j - 1]dp[i-1][j]的值转移得出 dp[i][j]的值就是该问题中的状态转移。而之前所说的数字量间的递推关系就被称为状态的转移规则,也被称为状态转移方程,确定状态的转移规则即确定了怎样由前序状态递推求出后续状态。如最长非递增子序列问题中的状态转移方程为:
在这里插入图片描述
最后来讨论动态规划问题的求解中相关时间复杂度的估计。

以最长公共子序列为例,设两个字符串长度分别为 L1 和 L2,则共有 L1*L2个状态要求解,为了求解每个状态,按照相应字符是否相等选取 dp[i - 1][j -1] + 1 或者 max(dp[i][j - 1],dp[i - 1][j])dp[i][j]的值,即状态转移过程中每个状态的得出仅需要 O(1)的时间复杂度,所以总的时间复杂度为 O(L1 * L2 * 1)

通过以上分析,同样也可以判断出求解最长递增子序列问题的时间复杂度构成:假设原数列长度为 n,则状态数量为 dp[n],状态转移过程中每个状态的得出复杂度平均为 O(n),所以其总的时间复杂度为 O(n*n)

总结一下,动态规划问题的时间复杂度由两部分组成:状态数量和状态转移复杂度,往往程序总的复杂度为它们的乘积。所以说,选择一个好的状态不仅关系到程序的正确性,同时对算法的复杂度也有较大的影响,它在动态规划问题中有着举足轻重的地位。相对来说空间复杂度则没那么容易确定,可能需要额外的内存空间来辅助状态的确定和转移,也可能通过某种内存的复用提高内存的利用率。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值