20200710:动态规划复习day03

动态规划复习day03

今天来看股票问题1

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5s5nYxU-1594389164415)(C:\Users\Mr IMMUNIZE\AppData\Roaming\Typora\typora-user-images\image-20200710203714129.png)]

解题思路

首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day。因此贴出代码如下:

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length == 0)
            return 0;
        int max = 0;
        int min = prices[0];
        for(int i=1;i<prices.length;i++){
            min = Math.min(min,prices[i]);
            max = Math.max(max,prices[i]-min);
        }
        return max;
    }
}

这不是我们想要的结果,我们需要通用的动态规划解法。

以此继续使用我们之前用的办法:找到dp数组的含义,直接看不出来,没关系,我们按照框架走:

第一步找到状态和选择:状态也就是股票的价格,选择为股票的买卖与否。

第二步找到dp之间的关系:我们假设dp [i] [0] 为股票在第i天我手上没股票时的利润,dp [i] [1]为股票在第i天手上有股票的利润。

第三步找到他们之间的转移关系,也就是状态转移方程。在此之前先确认我们最终要求的目标,是股票卖出之后的最大值:dp [i] [1]中的最大值。而转移关系也很明确,

  1. ​ dp [i] [1] = max (dp[i-1] [1],0-prices[i]);

    今天手里有股票的利润:要么我昨天手里就已经有股票了,今天啥都没干;要么昨天没股票,我今天买了一股。

  2. ​ dp [i] [0] = max(dp [i-1] [0],dp[i-1] [1] + price[i]);

    今天手里没股票的利润:要么昨天我就没股票,我今天啥也没干;要么昨天我有股票,今天我卖了。

如此即可完成代码如下:

代码实现

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length == 0)
            return 0;
        int[][] dp = new int[prices.length][2];

        // base case
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
		
        // dp转移过程
        for (int i = 1; i < prices.length; i++) {
            dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i-1][1],-prices[i]);
        }

        return (dp[prices.length - 1][0] <= 0) ? 0 : dp[prices.length-1][0];
    }
}

如此更加理解本题的思路过程,而不是简单的列举最大最小值。明天继续写后续的几道进阶题,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值