leetcode总结 dp动态规划(一)

目录

什么是动态规划 DP (dynamic programming)

两道简单的动态规划

121. 买卖股票的最佳时机 - 力扣(LeetCode)

 思路:

代码段

53. 最大子数组和 - 力扣(LeetCode)

 思路:

 代码段(来自评论区):


什么是动态规划 DP (dynamic programming)

动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题最短路径问题和复杂系统可靠性问题等中取得了显著的效果

                                                                                                ————来自百度百科

DP的思路: 利用原问题与子问题的关系,将其变成 大问题的解 = 小问题的解的函数, 从而将问题变成size的扩展即可,当size到达最大后,原问题解决了

举个简单的例子来说,计算1+1+1+1+1+1+1+1+1时可以得到9,如果这个时候再在前面加一个1+,那么可以直接得到1+9=10而不用再次算一次,这就是动态规划,把较为复杂的大问题分解为与小问题有关的函数。

两道简单的动态规划

121. 买卖股票的最佳时机 - 力扣(LeetCode)

 思路:

借用这道题下的一语中的的热评

我们只需要设置一个初始最大收益0,一个很大的初始最小价格,再对 所有的价格进行遍历,使得最大收益=max(当前最大收益, 当前价格-最小价格),并且保存遍历到的最小价格=min(当前价格,最小价格)

这样遍历一次后 得到的最大收益就是题目所求,同时满足没有最大收益时以初始值0返回的目的

代码段

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        minprice = int(1e9)
        maxprofit = 0
        for i in prices:
            maxprofit = max(i-minprice, maxprofit)
            minprice = min(minprice, i)
        return maxprofit

53. 最大子数组和 - 力扣(LeetCode)

 思路:

再借评论区大佬

不对是这个

 

思路很清晰,算法很简洁

从列表的第二个元素开始遍历,因为如果只有一个元素会直接返回最大值,也就是直接返回

遍历的时候,当前位置可以得到的最大数组和被保存在当前的位置,并且当前位置的最大数组和就是max(nums[i-1], 0)+nums[i]也就是说如果i-1位置的得到的最大数组和大于零就会被保存,否则会用0进行替换,直到遍历结束就可以获得最大数组

 代码段(来自评论区):

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            nums[i]= nums[i] + max(nums[i-1], 0)
        return max(nums)

以上 共勉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值