内功修炼——动态规划DP

一、DP定义

动态规划是把一个大问题拆解成一堆小问题。但是我们知道任何的大问题,应该都可以被分为小问题
,又不是所有的问题都可以使用DP来进行解决。所以使用DP与否取决于用DP解决的这些“小问题”会不会被重复调用。

通俗的说就是,我能不能用我已经处理过的数据来解决当前问题。这就要求我们得有保存历史记录的地方(用空间换时间)。

  1. DP没有递归,有数组,一般是二维,一般数组的最后一个元素就是我们要求的解
    因为数组存储前置结果,用这些结果可以进行递推。

  2. DP一般步骤:

    • 题目数据的维度去决定用几维数组;dp数组的含义
    • 用前面的一些元素推出当前元素,递推
    • 找初始值
    • 找元素之间的关系

二、例题解析

  1. (Leetcode 121 简单)给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
    如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
    注意:你不能在买入股票前卖出股票。
示例:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
  • 暴力方法:两层循环,每次找最大max
  • 动态规划滑动窗口:一次循环,保存历史最小值,和当前最大利润。时空复杂度O(n),O(1)
  1. 背包问题、爬楼梯、斐波那契数列、小偷如何偷最多东西等
    (后面用空了可以写一下具体思路)

写在最后

如果觉得本文对你有帮助的话,可以为我点个赞哈,你的关注和支持是我坚持下去最大的鼓励。

对文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。

发布了13 篇原创文章 · 获赞 13 · 访问量 636

猜你喜欢

转载自blog.csdn.net/coding_sleep/article/details/105296843
今日推荐