动态规划子序列时间复杂度分析
最长子序列的时间复杂度,用 D[]数组来还挺巧的。通过维护一个辅助数组 D[],可以在O(nlogn)
的复杂度下搞定最长上升子序列。每次判断当前元素a[t]
是不是比 D[len]大,如果是,直接接上;否则二分找个位置替换。代码也不复杂,性能还挺不错的,适合性能敏感的场景。
动态规划里,子序列问题一直是老大难,像最长公共子序列
、最长不下降子序列
这种题,基本都离不开状态转移和空间优化。你要是想系统地搞清楚这些玩法,下面这些资源都挺值一看的。
最长上升子序列 nlgn 源码,源码讲得清楚,细节比较扎实。
最长不下降与不上升子序列的双向,双向思路也蛮常用的,挺有意思。
最长公共子序列(C 语言实现),入门时蛮有,适合理清基本逻辑。
基于动态规划的最长递增子序列求解,讲得比较系统,适合初学者梳理思路。
如果你正好在做动态规划的练习题,不妨试试用 D[]方法来写下最长上升子序列,写着写着你就懂了什么叫“空间换时间”了。
529KB
文件大小:
评论区