首页 > 其他分享 >day 50 123.买卖股票的最佳时机III

day 50 123.买卖股票的最佳时机III

时间:2023-04-19 11:11:56浏览次数:43  
标签:int max 50 len 123 买入 prices III dp

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

一天一共就有五个状态,

  1. 没有操作 (其实我们也可以不设置这个状态)
  2. 第一次持有股票
  3. 第一次不持有股票
  4. 第二次持有股票
  5. 第二次不持有股票

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

达到dp[i][1]状态,有两个具体操作:

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);

同理dp[i][2]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

同理可推出剩下状态部分:

dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);

dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

 
class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        if (prices.length == 0) return 0;
        //0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出
        int[][] dp = new int[len][5];
        dp[0][1] = -prices[0];
          // 初始化第二次买入的状态是确保 最后结果是最多两次买卖的最大利润
        dp[0][3] = -prices[0];
           for (int i = 1; i < len; i++) {
            dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
            dp[i][2] = Math.max(dp[i - 1][2], dp[i][1] + prices[i]);
            dp[i][3] = Math.max(dp[i - 1][3], dp[i][2] - prices[i]);
            dp[i][4] = Math.max(dp[i - 1][4], dp[i][3] + prices[i]);
        }

        return dp[len - 1][4];
    }
}

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

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

   

第0天做第一次买入的操作,dp[0][1] = -prices[0];

第0天做第一次卖出的操作,这个初始值应该是多少呢?

此时还没有买入,怎么就卖出呢? 其实大家可以理解当天买入,当天卖出,所以dp[0][2] = 0;

第0天第二次买入操作,初始值应该是多少呢?应该不少同学疑惑,第一次还没买入呢,怎么初始化第二次买入呢?

第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后在买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。

所以第二次买入操作,初始化为:dp[0][3] = -prices[0];

第二次卖出初始化dp[0][4] = 0;

所以同理可以推出dp[0][j]当j为奇数的时候都初始化为 -prices[0]

class Solution {
    public int maxProfit(int k, int[] prices) {
  int len = prices.length;
        int[][] dp = new int[len][k*2 + 1];
        
        // dp数组的初始化, 与版本一同理
        for (int i = 1; i < k*2; i += 2) {
            dp[0][i] = -prices[0];
        }

        for (int i = 1; i < len; i++) {
            for (int j = 0; j < k*2 - 1; j += 2) {
                dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
                dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
            }
        }
        return dp[len - 1][k*2];
    }
}

 

 

标签:int,max,50,len,123,买入,prices,III,dp
From: https://www.cnblogs.com/libertylhy/p/17332649.html

相关文章

  • 简约的通用错误界面(400,500)
    案例https://jz-common-cdn.daojia.com/fe-common-page/error-page/index.html代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content=&quo......
  • 为啥chrome查看到网页,只有5000多行,应该有1万多行才对
    大家好,我是皮皮。一、前言前几天在Python白银交流群【磐奚鸟】问了一个Python网络爬虫处理的问题,这里拿出来给大家分享下。二、实现过程这里【惜君】给了一个指导,可能网站有限制数据量。这里【瑜亮老师】发现了问题所在,如下图所示:数据方面确实存在,顺利地解决了粉丝的问题。三、总结......
  • 成功解决OSError: [E050] Can’t find model ‘en_core_web_sm’.
    成功解决OSError:[E050]Can'tfindmodel'en_core_web_sm'.问题描述在安装spacy包之后,再加载'en_core_web_sm'语言模型时,报出OSError:[E050]Can'tfindmodel'en_core_web_sm'.Itdoesn'tseemtobeaPythonpackageoravalidpathtoa......
  • KB5024396 - SQL Server 2022 的累积更新 3
    发布日期: 2023年4月13日版本: 16.0.4025.1摘要本文介绍适用于MicrosoftSQLServer2022的累积更新包3(CU3)。此更新包含SQLServer2022累积更新2发布后发布的9个修补程序,并更新以下版本中的组件:SQLServer-产品版本:16.0.4025.1,文件版本:2022.160.4025.......
  • MD500E代码 包含pmsm的foc控制算法,电阻、电感、磁链等参数的辩识算法,死区补偿算法过调
    MD500E代码方案和解析文档+原理图+送仿真资料。资料最全,全新全新全新全新包含pmsm的foc控制算法,电阻、电感、磁链等参数的辩识算法,死区补偿算法过调制处理算法,弱磁控制算法,无感FOC控制算法,电流环自整定算法,磁链观测器算法。ID:8245670260640972......
  • 星起航跨境:亚马逊美国站又出新规,卖家可享50%的折扣
    经营亚马逊跨境电商平台店铺的卖家都知道,亚马逊的规则不会一成不变,随着市场环境的不断变化,亚马逊会时不时颁布新的平台政策。虽然有些政策从小方面会不那么利用部门卖家的成长,但是往大的方面讲,都是有利于平台跟绝大部分卖家可以更好地发展,也能帮助绝大部分卖家带来更多的销售机会,以......
  • ITBP 是什么?如何定位才能实现企业与员工双赢?(我们看了50份大厂JD)
    进入数字经济时代,大多企业都在努力推进数字化转型。然而在这个过程中,企业共同遇到的一大难点就是业务与IT的融合度不高、协同合作不足。IT不理解业务,他们往往从技术的角度考虑问题;而业务不明白IT,不知道如何将业务语言转化为IT问题。最后就导致蓝图是一个样,落地又是另一个样。在此情......
  • 代码随想录 46天 day198.打家劫舍 | | 337.打家劫舍 III | 213.打家劫舍II
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能......
  • 2-207-通过(LeetCode-509)熟悉动态规划的解题步骤
    1.题目 运态规划的定义   动态规划的解题步骤  2.解法2.1递归 publicstaticintfibonacci(intn){if(n==0){return0;}if(n==1){return1;}returnfibonacci(n-1)+fibonacci(n-2);}2.2运态规划+递归......
  • VAS5054A V19 setup steps
    TheVAS5054AV7.1.1isauniversaldiagnosticinterfaceforthevehiclesoftheVolkswagenGroupandallOBDvehiclesystemsfromothermanufacturers,mainlydoAUDIVWSeatSkoda,newlyaddBentleyandLamborghini.Itisbluetoothversion,anditsupport......