# -*- coding: utf-8 -*-
# @Time : 2019-09-27 22:09
# @Author : Jayce Wong
# @ProjectName : job
# @FileName : maxRetreat.py
# @Blog : http://blog.51cto.com/jayce1111
# @Github : https://github.com/SysuJayce
"""
题目形式:有一个数组,求其中两个数x,y,满足x的索引小于y的索引,使得 x-y 最大。
例如 arr = [3,7,2,6,4,1,9,8,5], 最大回撤是6,对应的x=7,y=1。
"""
def maxRetreat(nums):
"""
到了现在,我们应该对这种最大最小的最优化类的题目有一定的敏感度,知道要用动态规划。
由于输入是一维数组,我们可以用一个一维数组来保存子问题的状态。
dp[i]表示下标为i的元素的最大回撤
那么转移方程为:
dp[i+1] + nums[i] - nums[i+1], if dp[i + 1] > 0
dp[i] =
nums[i] - nums[i+1], else
其实这种题目我们应该做的就是使用一个例子来模拟一遍。如果我们从前往后计算每个下标的最大回撤,那
么会有很多重复计算的子问题,这一点类似于字符串解码的问题。而如果我们从后往前来计算每个下标的最
大回撤,那么就可以利用到已经计算出来的子问题的解。
而这个状态转移方程也是基于观察得到的。
:param nums: 待计算最大回撤的数组
:return: 输入的数组的最大回撤
"""
if not nums:
return 0
dp = [0] * len(nums)
maxRet = 0 # 可以用一个变量来保存全局最大的回撤的值,也可以不用,但是这样可以节省一次遍历
for i in range(len(nums) - 2, -1, -1):
if dp[i + 1] > 0:
dp[i] = dp[i + 1] + nums[i] - nums[i + 1]
else:
dp[i] = nums[i] - nums[i + 1]
maxRet = max(maxRet, dp[i])
return maxRet
print(maxRetreat([3, 7, 2, 6, 4, 1, 9, 8, 5]))
最大回撤
最新推荐文章于 2022-03-05 12:37:54 发布