dp和贪心的区别

动态规划和贪心算法都是一种递推算法
均有局部最优解来推导全局最优解

不同点:
贪心算法:
1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。
2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。

动态规划算法:
1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解
2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解
3.边界条件:即最简单的,可以直接得出的局部最优解

### 贪心算法与动态规划的区别及适用场景 #### 1. 思想差异 贪心算法的核心在于每一步都做出局部最优的选择,期望这些选择能够最终构成全局最优解[^1]。然而,这种策略并不总是能保证找到真正的全局最优解。相比之下,动态规划通过分解问题为多个子问题并存储中间结果的方式,系统性地探索所有可能的解决方案,从而确保获得全局最优解[^4]。 #### 2. 解决方案的构建方式 在解决问题的过程中,贪心算法通常不需要回顾之前的状态或决策,因为它假设当前所做的每一个决定都是最佳的[^3]。相反,动态规划会保存已解决子问题的结果,并利用这些结果去解答更大规模的问题,这种方法被称为“记忆化”或者“重叠子问题”的处理[^5]。 #### 3. 时间复杂度空间需求 由于其简单性直接性,贪心算法往往具有较低的时间复杂度以及较少的空间占用[^1]。但是当面对那些无法满足贪心性质的问题时,则需要转向更加复杂的动态规划方法。尽管如此,动态规划可能会因为大量的状态转移而导致较高的时间空间开销[^2]。 #### 4. 最优子结构性质的要求程度不同 虽然两者都需要问题具备最优子结构特性,即整体问题的最优解可以通过组合各个部分的最优解得出;但贪心算法对于这一特性的依赖更为严格——它不仅要求存在这样的子结构关系,还进一步假定每次单独作出的选择本身也是最优的[^3]。而动态规划即使是在某些情况下不能立即确认某个特定步骤是否是最优的情况下也能工作得很好。 #### 5. 应用实例对比 - **最长递增子序列(LIS)** 对于这个问题来说, 动态规划通过定义`dp[i]`表示以第i个元素结尾的最大长度LIS值来进行求解; 同样地, 如果采用贪心加二分查找的方法也可以高效完成此任务.[^2] - **硬币找零(Coin Change Problem)** 这是一个典型的适合使用动态规划的例子,在这里我们需要考虑多种可能性才能确定最少数量的硬币数目。如果尝试运用贪心法则的话,有可能得不到正确答案除非面额设置得特别合适使得总金额始终可以从最大可用面额开始减下去直到归零为止. ```java // Dynamic Programming approach to Coin Change problem. public int coinChange(int[] coins, int amount) { int max = amount + 1; int[] dp = new int[max]; Arrays.fill(dp, max); dp[0] = 0; for (int i = 1; i <= amount; i++) { for (int j = 0; j < coins.length; j++) { if (coins[j] <= i && dp[i - coins[j]] + 1 < dp[i]) { dp[i] = dp[i - coins[j]] + 1; } } } return dp[amount] > amount ? -1 : dp[amount]; } ``` #### 6. 结论 综上所述,选择何种算法取决于具体应用场景的特点及其约束条件。若问题是可分离成若干独立阶段且各阶段间不存在相互影响的情形下,那么可以优先选用效率更高的贪心算法;而对于其他大多数情况尤其是涉及多维度权衡考量的时候,则应倾向于借助灵活性更强同时也相对耗时更多的动态规划技术来获取精确结果。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值