zoukankan      html  css  js  c++  java
  • Leetcode 122. 买卖股票的最佳时机 II dp

    地址 https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/

    给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
     
    示例 1:
    输入: prices = [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
         随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
    
    示例 2:
    输入: prices = [1,2,3,4,5]
    输出: 4
    解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
         注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    
    示例 3:
    输入: prices = [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
     
    
    提示:
    1 <= prices.length <= 3 * 104
    0 <= prices[i] <= 104
    

    解答
    此题使用动态规划进行解答。
    题目描述的状态更像是从某个状态变化到另一个状态的状态变化过程。
    使用数组代表某日购买或者不购买股票的最大利润。那么就是dp[i][j]
    i代表第i天 j取值0或者1 表示手头持有股票与否
    那么第一天(索引从0 开始)
    dp[0][0]=0; dp[0][1] = -prices[0] (购买了股票 但是利润为负)

    状态转移的方程如下
    dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]);
    dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);

    表达的意义就是
    第i天手头不持有股票的最大利润就是:
    1 没有变化 与前一天不持有股票的最大利润相同 dp[i][0] = dp[i-1][0]
    2 将前一天持有的股票以当前的价格卖出 dp[i][0] = dp[i-1][1]+prices[i]

    第i天手头持有股票的最大利润就是:
    1 没有变化 与前一天持有股票的最大利润相同 dp[i][1] = dp[i-1][1]
    2 前一天没有持有股票,今天购买了当前价格的股票 dp[i][1] = dp[i-1][0]-prices[i]

    代码如下:

    class Solution {
    public:
        int dp[30010][2];
        int maxProfit(vector<int>& prices) {
            dp[0][0] = 0;
            dp[0][1] = 0 -prices[0];
            for(int i =1;i<prices.size();i++){
                dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
                dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
            }
    
            return max(dp[prices.size()-1][1],dp[prices.size()-1][0] );
        }
    };
    

    我的题解空间

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    手势识别 ios
    无题
    核心动画笔记
    Quartz2D的学习2
    Quartz2D的学习1
    NSURLsessionTask
    NSURLSession
    POST请求的两种方式
    网络第一天
    NSThread
  • 原文地址:https://www.cnblogs.com/itdef/p/14987797.html
Copyright © 2011-2022 走看看