小技巧—DP过程中序列的记录
小技巧—DP过程中序列的记录
一道例题:
求最长公共上升子序列的题。算是比较基础和经典的DP题目。
但是这道题目为什么是蓝了呢。。。可能就是因为它还需要维护一个序列的记录。
怎么维护呢?
我们开一个\(pre\)数组,表示当前状态的前一个位置是什么。即当前状态是由哪个状态新转移过来的。这样的话,我们只需要记录终止点pos,其前一个位置就是\(pre[pos]\),前一个就是\(pre[pre[pos]]\)。再前一个就是...(禁止套娃)
即记录出了整个路径。
最后的输出过程可以采用递归输出,但是没什么必要,一个while循环即可。
我们发现很多递归的东西其实都可以转成while循环,也就是非递归的形式。因为其本质是差不多一样的。while后面的条件就相当于函数的参数和递归出口。
讲完了。