先来一个有关动态规划的常规概念的描述
动态规划算法,又称DP算法,相信很多学习和打过算法赛的同学都知道,多多少少了解过。众所周知,dp算法的难度,在竞赛中通常为压轴题的难度,通常算法竞赛的难题,都多少涉及到动态规划(dp),这里就不作其他赘述。我相信,大家认同的观点都是:动态规划!难!
dp算法的本质是什么?作用是什么?
众所周知,dp算法,是用来简化和降低时间复杂度的!相比于普通的暴力枚举,暴力可能是指数级别的(O(2^n)),但是动态规划dp算法,可以简化时间复杂度,使其到O(n)级别 或者 O(n^2)级别,效率可以大大提高!从这个角度看,学好用好dp算法,是算法竞赛里面 很重要的一个部分!
dp算法正常教学模式的弊端
很多市面上的老师和课程,在讲授dp算法的时候,都会以所谓“老师”的角度来讲授和传达。何谓“老师”的角度呢?就是我知道答案了,然后反推过程来 为学生讲授解决dp问题。在我看来,这是不对的,是对于学生来讲不太负责任的行为。很容易想到,就是说我 拿到一道题目的时候,我是要从0开始去解决这个问题的,而不是知道100,然后去反推从0-100的过程。这是不恰当的。正确来讲,我们需要一个全新的,更好的方法,来帮助学生,真正的从学生的角度,去解决动态规划问题!!!!
我们将使用全新的方法去解决dp类问题
简要介绍完dp的概念和现在教学的现状,我会使用一道例题的模式,来为大家彻底讲清楚怎么使用全新的方法去解决dp问题!!!
以集合角度考虑DP问题
为什么dp算法能够简化时间复杂度?正是dp的本质:使用一个dp[i][j]来表示一类东西,简要来说,就是用一个数来表示一堆数(一类东西),所以它可以简化时间复杂度。
《摘花生》
大家先对题目进行阅读理解,我将用一个图,来描述解决问题的新方法:
写的有点潦草,但是只要各位读者愿意沉的下心来看,会收获颇丰!!!!
有人问最后的循环问题:是正着循环还是倒着循环呢?是i作为外层还是j作为外层呢???
如图所示,其实上面的所有就是得到所谓动态规划的最重要的 也是最难想的一个东西:状态转移方程:已经得到了,很有逻辑,请大家认真看完手写笔记,会收获颇丰!
具体代码实现
需要注意的是,当是起点的时候,将dp数组初始化为(1,1)的价值即可;
另外:
总结:注意
我们的方法与传统的不一样
传统的状态转移方程的定义是:从(1.1)到(i. j)的价值 的最大值
但是我们 的方法有所差别:从(1.1)到(i. j)的所有路线的 价值 的最大值
别小看这四个字,正是它表现了我们的集合思想,使得逻辑更加好,紧密!!!
记住我们要时刻扣紧我们的集合定义,动态规划问题迎刃而解;
这其实才是一个比较简单的dp问题的解决方式,后续更新我会将很多复杂dp问题的解决方式用这个方法呈现出来,更有逻辑,更站在学生的角度!!!!
点个关注不迷路!谢谢大家的支持,如果你觉得我讲的好,请你为我点一个免费的 小心心!!
感谢观看!