简单的dp入门

这篇博客介绍了动态规划的基础知识,包括动态规划题的特点、确定状态、转移方程、初始条件和边界情况以及计算顺序。通过实例解析了如何用最少的硬币拼出指定金额,阐述了动态规划解决问题的思路和步骤。
摘要由CSDN通过智能技术生成

动态规划题的特点

  1. 计数

    有多少种方式走到右下角

    有多少种方式选出k个数使得和是sum

  2. 求最大最小值

    从左上角走到右下角路径的最大数字和

    最长上升子序列长度

  3. 求存在性

    取石子游戏,先手是否必胜

    能不能选出k个数使得和是sum

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

状态在动态规划中的作用属于定海神针

简单的说,解动态规划的时候需要开一个数组,数组的每个元素f[i],或f[i] [j]代表什么?

类似于解数学题中,x,y,z代表什么

确定状态需要两个意识:

1.最后一步

2.子问题

动态规划组成二:转移方程

例题:一本书27元,有许多两元,五元,七元硬币,请用最少的钱数拼出27元

设状态F[X]=最少用多少枚硬币拼出X

对于任意X

F[X]=min{F[x-2]+1,F[x-5]+1,F[x-7]+1}

F[x-2]+1:拼出X-2所需最少的硬币数,加上最后一枚硬币2,

其它两个一样

动态规划组成部分三:初始条件和边界情况

F[X]=min{F[x-2]+1,F[x-5]+1,F[x-7]+1}

两个问题: X-2,X-5 or X-7小于0怎么办?

如果不能拼出Y,就定义F[Y]=正无穷

例如F[-1]=F[-2]=…=正无穷

所以F[1]=min{F[-1]+1,F[-4]+1,F[-6]+1}表示正无穷,拼不出1

初始条件:F[0]=0

动态规划组成部分四:计算顺序

  1. 拼出X所需要的最少硬币数:F[X]=min{F[x-2]+1,F[x-5]+1,F[x-7]+1}
  2. 初始条件:F[0]=0;
  3. 然后计算F[1],f[2]…F[27];
  4. 当我们计算到F[X]时,F[X-2],F[X-5],F[X-7]都已经计算出来了

动态规划是从小而上思考递归是从上而下思考
在这里插入图片描述

​ return (res[res.length >> 1] + res[(res.length >> 1) - 1]) / 2.0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值