dp和dfs的区别与联系
核心思想的区别
DFS (Depth-First Search)本质:暴力枚举。
它像走迷宫,选一条路一直走到黑(递归到底),如果没有路了,就回退一步(回溯),换一条路再走。
关注点:过程。
它关注“我现在怎么走?下一步去哪?”挖地雷中的DFS:比如从地窖1出发,先试 \(1 \to 2 \to 4\),算出总数;然后回溯到2,试 \(1 \to 2 \to 5\)... 它会把所有可能的路线都跑一遍。
DP (Dynamic Programming)本质:递推与复用。
它把大问题拆成小问题,并且记下小问题的答案。如果下次遇到同一个小问题,直接查表,不再重新算。(图表法)
关注点:结果(状态)。
它关注“到达第 \(i\) 个点时,最好的结果是多少?”挖地雷中的DP:到达地窖4时,我只关心“从哪里走到4地雷最多(是从2来还是从3来?)”,选一个最大的存下来。以后不管谁问地窖4的情况,我都直接告诉他这个最大值,不用再倒回去重走。
效率的区别
假设有一个图,很多条路都能汇聚到同一个点 \(X\),然后再从 \(X\) 走向终点。
DFS(纯递归)的问题:重复计算。
路径 A 走到了 \(X\),DFS 会继续把 \(X\) 后面的路全走一遍。
路径 B 也走到了 \(X\),DFS 会再次把 \(X\) 后面的路全走一遍。
时间复杂度:通常是指数级 \(O(2^N)\),数据大一点(比如 \(N=50\))就会超时。
DP 的优势:消除重叠子问题。
路径 A 走到 \(X\) 时,算出 \(X\) 后面的最优解,存在 dp[X] 数组里。
路径 B 走到 \(X\) 时,发现 dp[X] 已经有数了,直接拿来用,不用往下走了。
时间复杂度:通常是多项式级 \(O(N^2)\) 或 \(O(N)\),非常快。
适用场景的区别

浙公网安备 33010602011771号