什么是动态规划
上图中题目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]=