一招通解->通解动态规划DP问题,让你不再为DP苦恼

先来一个有关动态规划的常规概念的描述

动态规划算法,又称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问题的解决方式用这个方法呈现出来,更有逻辑,更站在学生的角度!!!!

点个关注不迷路!谢谢大家的支持,如果你觉得我讲的好,请你为我点一个免费的 小心心!!

感谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值