day51 --动态规划10

  •  121. 买卖股票的最佳时机 
  •  122.买卖股票的最佳时机II 

第一题:买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

  • 示例 1:

  • 输入:[7,1,5,3,6,4]

  • 输出:5

0、贪心的算法思路是求得局部最优,然后求得全局最优,

1、动态规划的思路是用一个二维dp数组,一维dp[i][0]表示第i天持有股票所得最多现金

另一维dp[i][1]表示第i天不持有股票所得最多现金。

(1)确定dp数组及其下标含义

dp[i][0]:  表示第i天持有股票所得最多现金,可正可负

dp[i][1]:  表示第i天不持有股票所得最多现金

(2)确定递推公式

首先dp[i][0]可以由两个状态求出来

要么是今天没买,保持昨天的状态,也就是dp[i-1][0]

要么是今天买了,所得现金就是买入今天股票后所得现金即:-prices[i]

所以dp[i][0]=max(dp[i-1][0],-prices[i]);

对于dp[i][1]也可以由两个状态求出来

要么是前一天就卖出去了,今天就维持现状,所持现金就没变:dp[i-1][1]

要么是今天正好卖出,所得现金就是今天的价格卖出的所得现金:prices[i]+dp[i-1][0]

同样dp[i][1]取最大的,dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]);

(3)dp数组如何初始化

根据递推公式,两者都是从dp[0][0]和dp[0][1]开始推导出来,所以,dp[0][0]-=prices[0]

表示第0天不持有股票,所以现金是0,dp[0][1]=0;

(4)确定遍历顺序

dp[i]都是由dp[i-1]推出来的,所以一定是从前向后遍历

(5)举例推导数组

根据prices=[7,1,5,3,6,4]可得

dp[0][0]=-7; dp[0][1]=0

dp[1][0]=-1; dp[1][1]=max(0,-6)=0

dp[2][0]=-1; dp[2][1]=max(0,4)=4

dp[3][0]=-1; dp[3][1]=max(4,2)=4

dp[4][0]=-1; dp[4][1]=max(4,5)=5

dp[5][0]=-1; dp[5][1]=max(5,3)=5

本题有多种方法可解决,动态规划比较难构思,第二题不做学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值