真实面经题目 · 原创解析
贪心算法和动态规划分别是什么?
这题考察候选人能否区分局部选择和状态枚举,关键是证明贪心安全性,并能写出 DP 的状态、转移、边界和遍历顺序。
真实面经题目 · 原创解析
这题考察候选人能否区分局部选择和状态枚举,关键是证明贪心安全性,并能写出 DP 的状态、转移、边界和遍历顺序。
贪心是每一步做当前看起来最优的选择,并且必须证明这个选择不会排除全局最优,常用交换论证或反证法;动态规划是把问题拆成有重叠子问题和最优子结构的状态集合,通过状态定义、转移方程、初始化边界和遍历顺序复用计算结果。两者都可能利用最优子结构,但贪心只保留一条决策路径,DP 会保留足够多的中间状态。无法证明局部选择安全、当前选择会影响未来时,通常优先考虑 DP 或搜索。
贪心不是凭直觉选最大或最小,而是要证明存在一个最优解包含当前选择。区间调度按结束时间最早选择,就是因为它给后续留下最多空间。
DP 的核心是 `dp[i]` 或 `dp[i][j]` 表示什么。状态定义错了,转移再漂亮也不成立。定义后再写转移、初始化、遍历顺序和答案位置。
贪心每轮丢弃大量候选,只保留当前路径;DP 保存多个子问题结果,让未来选择可以比较不同历史。0/1 背包通常不能只按性价比贪心,因为局部选择可能挤掉更优组合。
如果未来只依赖当前状态而不依赖到达该状态的具体路径,就有无后效性;如果大量子问题会重复出现,就适合记忆化搜索或表格 DP。
0/1 背包容量要倒序,避免同一物品在一轮里被重复使用;完全背包容量可正序,允许重复选择。面试里这类细节能区分会背和会写。
局部最优不天然推出全局最优。证明要说明把任意最优解替换成当前选择后不会更差,或反证当前选择不可能伤害最优性。
状态定义、状态转移、边界初始化。实际写题还要补遍历顺序、答案位置和空间优化口径。
容量是离散约束,局部性价比最高的物品可能占用容量,导致更高总价值组合无法选择,所以要比较不同容量下的最优状态。
状态转移天然递归、有效状态较少时记忆化更直观;状态空间规则且需要控制遍历顺序时表格 DP 更清晰。