Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown)

股票问题:

309. 最佳买卖股票时机含冷冻期

714. 买卖股票的最佳时机含手续费



给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。?

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

DP定义:dp[i][j]表示在第i天,手上持有j个股票状态转移方程: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、第i-1天的时候就没有,第i天休息了,什么都没干2、第i-1天的时候有股票,但是第i天把股票卖了二、在第i天,手上有股票,有两种原因:1、第i-1天的时候就没有,第i天啥都没干2、第i-1天的时候没有股票,第i天买入了一支

注意:题中加入了冷冻期,即我再买入时,需要离上次卖出的时间隔2天。那我们的状态转移方程需要更改的地方就在第二点的第2条里:需要把第2条改为:第i-2天的时候没有股票(因为卖掉了),第i-1天休息了,因为冷冻期,第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-2][0]-prices[i]);

AC代码:
class Solution {
    public int maxProfit(int[] prices) {
        if(prices==null || prices.length==0) return 0;

        int[][] dp = new int[prices.length][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for (int i = 1; i < prices.length; i++) {
            dp[i][0] = Math.max(dp[i-1][1]+prices[i],dp[i-1][0]);
            if(i-2<0){
                dp[i][1] = Math.max(0-prices[i],dp[i-1][1]);
            }else dp[i][1] = Math.max(dp[i-2][0]-prices[i],dp[i-1][1]);
        }
        return dp[prices.length-1][0];
    }
}
 


原文地址:https://www.cnblogs.com/qinyuguan/p/11487574.html

时间: 2024-10-16 19:18:52

Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown)的相关文章

309. 最佳买卖股票时机含冷冻期

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .? 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天). 示例: 输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出] 未持有股票和冷冻期设置为同一种状态dp1,持有股票设置为一种状态dp2. 未持

Leetcode 309 最佳买卖股票时机含冷冻期 (动态规划)

又是一道找到了状态转移方程,就可以迎刃而解的问题 但是状态转移方程不好找啊 分析题目: 每一天的四种状态:买进.卖出.冷冻期.什么都不做 每天的状态排列遵循:买...卖冷...买...卖冷...  其中...代表什么都不做的日子,可能有多个 因为有的日子什么都不做,没办法指明某一天到底进行了哪种操作,所以将状态定为“这一天及之前进行的最后操作” 第i天及以前,进行的最后操作为买进,所获得的最大收益:sell[i] 类似地定义buy[i] ,cool[i] 状态转移方程: sell[i]=buy[

leecode 309. 最佳买卖股票时机含冷冻期

/***** //sell[i]表示截至第i天,最后一个操作是卖时的最大收益: //buy[i]表示截至第i天,最后一个操作是买时的最大收益: //cool[i]表示截至第i天,最后一个操作是冷冻期时的最大收益: //递推公式: //sell[i] = max(buy[i-1]+prices[i], sell[i-1]) (第一项表示第i天卖出,第二项表示第i天冷冻) //buy[i] = max(cool[i-1]-prices[i], buy[i-1]) (第一项表示第i天买进,第二项表示第

122. 买卖股票 求最大收益2 Best Time to Buy and Sell Stock II

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). Ho

309. Best Time to Buy and Sell Stock with Cooldown

/* * 309. Best Time to Buy and Sell Stock with Cooldown * 2016-7-4 by Mingyang * http://buttercola.blogspot.com/2016/01/leetcode-best-time-to-buy-and-sell.html * *1. Define States * *To represent the decision at index i: *buy[i]: Max profit till inde

LeetCode Best Time to Buy and Sell Stock with Cooldown

原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题目: Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many

Best Time to Buy and Sell Stock with Cooldown -- LeetCode

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) wit

[LeetCode] 123. Best Time to Buy and Sell Stock III 买卖股票的最佳时间 III

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete at most two transactions. Note:You may not engage in multiple transactions at the same time (ie,

[LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete at most k transactions. Note:You may not engage in multiple transactions at the same time (ie, yo