动态规划基础部分01什么是动态规划!

585 阅读3分钟

什么是动态规划?

动态规划,英⽂:Dynamic Programming,简称DP,如果某⼀问题有很多重叠⼦问题,使⽤动态规划是最有效的。
其实动态规划是递归算法优化而来,在递归算法对一些有规律的问题进行递归时会进行很多次重复无意义的计算,而对于这种情况的优化就是递归加剪枝将重复多余的计算部分剪掉,而动态规划则就是有规律的递归问题进行剪枝和正向推导优化而来,所以所以动态规划中每⼀个状态⼀定是由上⼀个状态推导出来,而且大部分的动态规划问题都可以用递归解决,而只有部分递归问题可以用动态规划解决。
说起动态规划问题相信有很多的朋友都有一些谈虎变色的感觉,每次在力扣上刷到动态规划的题目都有一点感觉但就是做不出来然后看着题解一知半解的自己写出来,一提交就错误,和题解对比又没有找到没有错误的地方,然后要不是浪费了很多时间找到了错误,要不就是直接放弃ctrl+cv了。反正就是就是⼀种朦胧的状态,然后就把题给过了不管哪种情况当下一次再遇到有一点变化的动态规划题目时还是不会做,就很让人崩溃。
最近我关注了一个微信公共号叫代码随想录从中大受启发,所以在这里分享个大家。
首先对于动态规划问题,将拆解为如下五步曲,这五步都搞清楚了,那解决动态规划问题就很简单了

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

肯定有不少朋友对动规的理解是:递推公式是才是最难最重要的,只要想出递归公式,其他都好办。其实这么想的朋友基本对动规理解的不到位的。动规五部曲⾥,前四部哪⼀部没想清楚,这道题⽬基本就做不出来,即使做出来了也没有想清楚,⽽是朦朦胧胧的就把题⽬过了。
最后大家在做动态规划时如果解答出现了,其实可以⾃⼰先思考这三个问题:

  • 这道题⽬我举例推导状态转移公式了么?
  • 我打印dp数组的输出了么?
  • 打印出来了dp数组和我想的⼀样么?

如果这灵魂三问⾃⼰都做到了,基本上这道题⽬也就解决了,或者更清晰的知道⾃⼰究竟是哪⼀点不明⽩,是状态转移不明⽩,还是实现代码不知道该怎么写,还是不理解遍历dp数组的顺序。然后在问问题,⽬的性就很强了。