拿下技术面上传简历

给定 n=1000 的数组 a,求最长递增子序列长度。你写了一个记忆化搜索 dfs(i),表示以 i 结尾的 LIS 长度。请写出状态定义、转移和递归边界,说明 memo 数组怎么初始化、为什么这个递归会有重复子问题。相比自底向上 DP,记忆化搜索在什么场景下更有优势?如果状态中还要记录“是否已经选过某个元素”,还能简单用一维 memo 吗?

数据结构与算法动态规划与贪心1-3 年知识点 1 个

面试官在考什么

判断是否理解记忆化搜索的本质是自顶向下 DP,以及状态不完整时 memo 会失效。

记忆化搜索

回答框架 · 前两步

  1. 状态:dfs(i)=以 i 结尾的 LIS 长度;转移:dfs(i)=1+max{dfs(j) | j<i 且 a[j]<a[i]};边界:没有可转移的 j 时返回 1。
  2. memo[i] 存 dfs(i),初始化为 -1 表示未计算;计算后先写 memo 再返回。

还有 3 条答案要点、 3 层追问、 5 个常见坑, 以及针对你简历的追问路径,在定制报告里。

上传简历,生成我的题库先看示例报告

延伸阅读

想看这个方向的整体准备路线? 进入「数据结构与算法」方向页

同一能力域的其他题