DP动态规划学习回顾
前言
在开学前,我一时兴起,想重拾我在一年或两年前学习的c++,就学习了动态规划。不知不觉距离开学已过了三周,我没有过多练习动态规划,想来写一篇动态规划的学习回顾,算是复习了,也希望为其他人提供一些学习的思路吧。(本人水平并不高,如果文章中有错误,请多多包涵)(感谢b站上的老师和教程,我也是从其他大佬的视频中学来的)
正文
在我看来,动态规划就是通过对题目的分析,来得出此状态和前一个状态(或前多个状态)的联系,从而优化代码的复杂度。
例一:跳台阶
我们从一个例子开始讲起。
这里有十级台阶,从第一阶开始走,每次可以走1或2级台阶,问有几种走法。
这个题目中,人的状态有十种,分别是在“第十阶”、“第九阶”、“第八阶”等等,我们可以将他们标注为dp[10]、dp[9]、dp[8]等等。我们直接对dp[10]的情况进行分析,第十阶仅能由第九阶爬一步和第八阶爬两步两种情况爬上来,所以爬到第十阶台阶的方法数dp[10]是爬到第九阶方法数dp[9]和爬到第八阶方法数dp[8]的和,也就可以表示为dp[10] = dp[9] + dp[8]。
以此类推,我们可以对第n级台阶的情况进行分析,第n级台阶仅能由第(n-1)级台阶和第(n-2)级台阶爬上来,可以得出的表达式为dp[x] = dp[x-1] + dp[x-2],这就是我上文所提到的此状态和前一个状态(或前多个状态)的联系,这个联系可以由个体推到整体,也可以直接通过分析题目来得出。
下面是代码实现:
1 | #include<iostream> |
例二:背包问题
背包问题例题,对于每个物品来说,都有放或者不放两种情况,我们只需要判断是放入使价值最大还是不放入使价值最大。
代码分析
话不多说,直接上AC代码。
1 | #include<iostream> |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.