集合描述
首先,对于任何的dp问题,其 dp 集合中的元素都可以抽象成一个决策序列(在搜索中,每一个叶子节点都代表着一个决策序列,这两个决策序列是同一个意思),但是,具体的决策序列应该如何描述呢?
dp[i][j] 的含义我们定义成将 s1 的前缀 [0,i) 变换成 s2 的前缀 [0,j) 的所有操作序列中,长度最短的序列的长度
例如,字符串 "ab"
转变成 "bc"
的决策序列如何表述呢,答案很多,我们举两个例子:
- (将 0 号位置转换成 b ,将 1 号位置转变成 c)
- (将 0 号位置删除,将 1 号位置添加一个 c)
这就是我要描述的具体例子,而且通过这样的描述,我们获得了直观的最优子结构性质,例如第二个例子中,“将 0 号位置删除”不就正是,dp[2][1]
的集合中的元素吗
当然事情还没有彻底解决,我们需要给决策序列定义一个描述规则。首先,我们规定所有的操作都需要指定原字符串的下标,例如删除操作就形容成 “删除下标为 0 的元素”,增加操作有些特殊,我们定义 “在位置 i 处增加一个元素 c” 为在 i
和 i + 1
之间 append 一个元素 c(例如,"ab"
在依次执行了 “在 0 处增加一个 c” 和 “在 0 处增加一个 d” 后,变成了 "acdb"
)。不难证明,这样的描述足可以定义出原字符串所有有意义的变换,什么叫无意义?增加一个元素又把他删了就是无意义的,对于增加的操作我们不可能会删除它,也不会修改它。最后我们定义操作序列的排序以下标为续,同下标依次为,删除,修改,添加,那么通过这样的定义,我们保证了任何一个操作序列的前缀可以称为一个有意义的子结构
通过这样的定义,我们终于也能真正理解“将集合划分成删除第i个元素,修改第i个元素,在第i个元素添加三个部分”的真正含义。上述的三个描述其实都需要加上“最后一个操作为”的描述,即“将集合划分成最后一个操作是删除第i个元素,修改第i个元素,在第i个元素添加三个部分”。再以此为依据,分别讨论这三类操作序列在删掉最后这个操作之后的子结构是什么,那么就可以轻易的得到视频中讲解的三个部分了
感觉讲的有点乱,自己的概念集合不足以更精准的描述我想表达的东西了,关键就一句话:集合内的元素是决策序列