动态规划学习(一):最值型

什么问题可以用动态规划求解

计数

  • 有多少种方式走到右下角
  • 有多少种方法选出k个数使得和是Sum

求最大最小值

  • 从左上角走到右下角路径的最大数字和
  • 最长上升子序列长度

求存在性

  • 取石子游戏,先手是否必胜
  • 能否选出k个数使得和是Sum

例题1 硬币组合问题

Lintcode 669
在这里插入图片描述
想法1 尽量用大的硬币
结果是:7 + 7 + 7 = 21 ,21 + 2 + 2 + 2 = 27,共6枚硬币
正确答案:7 + 5 + 5 + 5 + 5 = 27,5枚硬币

动态规划组成部分一:确定状态

  • 状态在动态规划中的作用属于定海神针
  • 动态规划需要开一个数组,数组的每个元素 f [ i ] 或者 f [ i ][ j ] 代表什么
    – 类似于解数学题中的 X,Y,Z代表什么
  • 确定状态需要两个意识
    – 最后一步
    – 子问题

对于例题1,

  • 虽然我们不知道最优策略是什么,但最优策略一定是K枚硬币a1,a2,…,ak,加起来面值是27
  • 一定有一枚最后的硬币:ak
  • 除掉这枚硬币,前面硬币的面值加起来是27 - ak
  • 在这里插入图片描述

关键点1:我们不关心前面的k-1枚硬币是如何拼出27 - ak 的(或有1种拼法或100种),而且甚至现在不知道 ak 和k,但我们确定前面的硬币频出了27 - ak

关键点2:因为是最优策略,所以拼出27 - ak 的硬币数量一定要最少。

子问题

简介

  • 所以我们就要求:最少用多少枚硬币可以拼出27 - ak
  • 原问题是最少用几枚硬币拼出27
  • 我们将原问题转换成了一个子问题,而且规模更小:27 - ak
  • 为了简化定义,我们设状态 f ( x ) f(x) f(x) 表示:最少用几枚硬币拼出X

只要找到子问题,就可以用动态规划求解,如何确定状态十分重要

  • 我们还不知道最后那枚 ak 是多少?

  • 最后那枚 ak 只可能是2,5或者7

  • 如果 ak 是2, f ( 27 ) f(27) f(27)应该是 f ( 27 − 2 ) f(27-2) f(272) + 1 (加上最后这枚硬币2)

  • 如果 ak 是5, f ( 27 ) f(27) f(27)应该是 f ( 27 − 5 ) f(27-5) f(275) + 1 (加上最后这枚硬币5)

  • 如果 ak 是7, f ( 27 ) f(27) f(27)应该是 f ( 27 − 7 ) f(27-7) f(277) + 1 (加上最后这枚硬币7)

  • 除此之外没有其他可能

  • 新要求最少的硬币数,所以:
    f ( 27 ) = m i n ( f ( 27 − 2 ) + 1 , f ( 27 − 5 ) + 1 , f ( 27 − 7 ) + 1 ) f(27) = min(f(27-2)+1, f(27-5)+1, f(27-7)+1) f(27)=min(f(272)+1,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值