leetcode动态规划笔记

动态规划问题的⼀般形式就是求最值。求解动态规划的核⼼问题是穷举,最优解可以从其子问题的最优解构造出来
⾸先, 动态规划的穷举有点特别, 因为这类问题存在「重叠⼦问题」 , 如果
暴⼒穷举的话效率会极其低下, 所以需要「备忘录」 或者「DP table」 来优
化穷举过程, 避免不必要的计算。

⽽且, 动态规划问题⼀定会具备「最优⼦结构」 , 才能通过⼦问题的最值得
到原问题的最值。只有列出正确的「状态转移⽅程」 才能正确地穷举。
重叠⼦问题、 最优⼦结构、 状态转移⽅程就是动态规划三要素。
如何列出正确的状态转移⽅程?(凑零钱为例)
先确定「状态」 , 也就是原问题和⼦问题中变化的变量。 由于硬币数量⽆
限, 所以唯⼀的状态就是⽬标⾦额 amount
然后确定 dp 函数的定义:当前的⽬标⾦额是 n , ⾄少需要 dp(n) 个硬
币凑出该⾦额
然后确定「选择」 并择优, 也就是对于每个状态, 可以做出什么选择改变当
前状态。 具体到这个问题, ⽆论当的⽬标⾦额是多少, 选择就是从⾯额列表
coins 中选择⼀个硬币, 然后⽬标⾦额就会减少:
最后明确 base case, 显然⽬标⾦额为 0 时, 所需硬币数量为 0;当⽬标⾦额
⼩于 0 时, ⽆解, 返回 -1:
在这里插入图片描述
System.arraycopy()方法实现复制
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
其中:src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度

语法:map.getOrDefault(key,defaultValue);

当map中存在key时,输出对应的value

当map中不存在key时,输出defaultValue

动态规划的题目分为两大类,一种是求最优解类,典型问题是背包问题,另一种就是计数类,比如这里的统计方案数的问题,它们都存在一定的递推性质。前者的递推性质还有一个名字,叫做 「最优子结构」 ——即当前问题的最优解取决于子问题的最优解,后者类似,当前问题的方案数取决于子问题的方案数。所以在遇到求方案数的问题时,我们可以往动态规划的方向考虑。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值