首页 > 其他分享 >day49

day49

时间:2023-03-04 22:00:29浏览次数:27  
标签:状态 int 第一次 持有 day49 prices dp

1、leetcode123 买卖股票的最佳时机Ⅲ

  1. 动规五步法

    1. dp[i] [j] : 在第i天,j状态下能获得的最大利润
      1. j = 0 : 第一次持有
      2. j = 1:第一次不持有
      3. j = 2:第二次持有
      4. j = 3:第二次不持有
    2. 递归公式
      1. dp[i] [0] = max( dp[i-1] [0] , -prices[i])
        1. 之前就处于第一次持有状态
        2. 当天第一次买入
      2. dp[i] [1] = max( dp[i-1] [1] , dp[i-1] [0] + prices[i] )
        1. 之前就处于第一次不持有的状态
        2. 当天第一次卖出
      3. dp[i] [2] = max(dp[i-1] [2], dp[i-1] [0] - prices[i] + prices[i],dp[i-1] [1] - prices[i] )
        1. 之前就处于第二次持有的状态
        2. 之前处于第一次持有的状态,当天进行第一次卖出以及第二次买入
        3. 之前处于第一次不持有的状态,当天进行第二次买入
      4. dp[i] [3] = max( dp[i-1] [3] ,dp[i-1] [2] + prices[i] , dp[i-1] [1], dp[i-1] [0]+prices[i])
        1. 之前就处于第二次不持有的状态
        2. 之前处于第二次持有的状态,当天第二次卖出
        3. 之前处于第一次不持有的状态,当天进行第二次的买入、卖出
        4. 之前处于第一次持有的状态,当天进行第一次卖出、第二次的买入、卖出
    3. 初始化
      1. dp[0] [0] = -prices[0]
      2. dp[0] [1] = 0
      3. dp[0] [2] = -prices[0]
      4. dp[0] [3] = 0
    4. 遍历顺序
      • 从前向后遍历
    5. 举例
  2. 代码

    class Solution {
        public int maxProfit(int[] prices) {
            int[][] dp = new int[prices.length][4];
            dp[0][0] = -prices[0];
            dp[0][1] = 0;
            dp[0][2] = -prices[0];
            dp[0][3] = 0;
    
            for(int i=1; i<prices.length; i++) {
                dp[i][0] = Math.max(dp[i-1][0] , -prices[i]);
                dp[i][1] = Math.max(dp[i-1][1] , dp[i-1][0] + prices[i]);
                dp[i][2] = Math.max(dp[i-1][2] , dp[i-1][1] - prices[i]);
                dp[i][3] = Math.max(dp[i-1][3] , dp[i-1][2] + prices[i]);
            }
    
            return dp[prices.length-1][3];
        }
    }
    

2、leetcode188 买卖股票的最佳时机Ⅳ

  1. ​ dp[i] [j] : 在第i天,j状态下能获得的最大利润

    • j为奇数表示持有状态;j为偶数表示不持有状态
  2. 代码

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

标签:状态,int,第一次,持有,day49,prices,dp
From: https://www.cnblogs.com/hzj-bolg/p/17179288.html

相关文章

  • 【算法训练营day49】LeetCode121. 买卖股票的最佳时机 LeetCode122. 买卖股票的最佳时
    LeetCode121.买卖股票的最佳时机题目链接:121.买卖股票的最佳时机独上高楼,望尽天涯路感觉贪心会更简单,动态规划反而搞复杂了对于这道题。慕然回首,灯火阑珊处第一次看......
  • day49-初始vue
    初始vuevue在htmlcssjs的基础上进行封装和实例化,更简单方便使用vue首先要引入vue<head><metacharset="UTF-8"><title>Title</title><!--引入vue......
  • 进入python的世界_day49_Django的基本配置、ORM、前后端数据库的相联
    ​ 接口就是一个网址一、静态文件​ 不需要经常改变的文件,主要针对HTML文件所用到的资源,在django中,要提前手动创建一个文件夹,static,然后里面自己再分门别类一下#比如......
  • day49 redis安装、Another-Redis-Desktop-Manager & redis数据类型 &集成redis(jedis)
    关系型数据库MySQL、SQLServer、Oracle、postgreSQL(pg)数据存储位置:硬盘数据存储结构:行和列优点:可以实现更复杂的业务逻辑(事务、存储过程、索引)、持久化保存哪种类型......
  • day49
    webEL表达式EL表达式:expressionlanguage 表达式语言,主要是从作用域中获取值格式:${}JSTL标签库:jsp页面中的标签库(c标签)解读标签fmt标签转年月日先将数......
  • day49-JDBC和连接池05
    JDBC和连接池0511.BasicDAO先来分析一个问题前面我们使用了Apache-DBUtils和Druid简化了JDBC开发,但仍存在以下不足:SQL语句是固定的,不能通过参数传入,通用性不好,需要......
  • 前端Vue2-Day49
    Vue.set方法和vm.$set方法:参数(实例对象的某一属性名,属性名,属性值)用于给实例化Vue对象的某一个属性对象动态添加子属性。不允许直接给实例化对象添加属性。即参数第一项不......
  • 学习python-Day49
    今日内容作业尝试编写JS时间案例 页面定时器案例 有一个input框两个按钮一个开始一个结束 1.点击开始按钮input内展示当前时间并按秒数刷新......