动态规划详解-入门

本文介绍了动态规划的基础知识,包括动态规划的定义、三种类型题(最值问题、计数问题、存在型问题)及解题四步法:确定状态、状态转移方程、计算顺序。通过实例解析了状态分析、状态转移方程的建立以及计算顺序的选择。文章适合初学者,帮助理解动态规划的核心思想。
摘要由CSDN通过智能技术生成

什么是动态规划

在这里插入图片描述
上图中题目A是用动态规划做 而题目B是用dfs

动态规划的三种类型题

在这里插入图片描述
现在让我们先看一道例题

在这里插入图片描述
通过题目我们发现这是一道求最值问题,如果暴力时间复杂度会非常大,这时候就需要用上动态规划了
而我们求解一道动态规划的题目需要进行四步
在这里插入图片描述

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

在这里插入图片描述

确定状态的关键点就在于最后一步操作和划分成子问题
在这里插入图片描述在这里插入图片描述
现在我们的问题就变成了找27-ak时最少的硬币数+1
这就是划分子问题
在这里插入图片描述
此时我们的f(x)的含义就是最少用多少枚硬币拼出的都X
在这里插入图片描述当状态分析完后 我们需要写出状态转移方程

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

在这里插入图片描述
状态方程推导出来后,我们需要注意初始条件和边界问题,防止数组越界
在这里插入图片描述
首先是初始化条件 当X=0时 我们不需要任何硬币即可推出f[0]=0;
而假设我们拼不出f[x] 即将f[x]值赋正无穷,这里我们可以理解为在初始化时
不仅要将f[0]赋值0 还有将每一个f[x] (x>0)赋值为正无穷。
当我们接下来去dp更新时再将有解的f[x]更新。

下面我们需要考虑的是动态规划中的计算顺序 是正序还是逆序 要根据我们的题来判断

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

在这里插入图片描述
本题是根据正序来算的。
下面我们再来重新分析这个题

例题一(求最值问题)

在这里插入图片描述

    public int coinChange(int[] coins, int amount) {
   
        int len = coins.length;
        int max = Integer.MAX_VALUE;//无穷
        int f[] = new int[amount+1];//状态转移数组
        f[0]=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值