首页 > 其他分享 >Day 42 动态规划 Part09

Day 42 动态规划 Part09

时间:2024-08-13 20:38:21浏览次数:8  
标签:Part09 stat int max 42 states prices Day Math

188. 买卖股票的最佳时机 IV

做完上一道题后再看就简单许多了。股票问题的重点就在于两点:

  1. 找到所有的状态
  2. 状态如何转移

对于本题,一共包含2*k种状态(第1,2...k次持有,第1,2...k次卖出)。状态间如何转移呢?见下图

class Solution {
    public int maxProfit(int k, int[] prices) {
        int[] states = new int[2*k];
        Arrays.fill(states, Integer.MIN_VALUE);
        for(int i = 0; i < prices.length; i++){
            for(int j = 0; j < k; j++){
                states[2*j] = Math.max(states[2*j], 
                    2*j == 0 ? -prices[i] : states[2*j-1] - prices[i]); 
                states[2*j+1] = Math.max(states[2*j+1], 
                    states[2*j] + prices[i]);
            }
        }
        return states[2*k-1];
    }
}

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

难度还是挺大,尽管最后写出来了,但感觉写完自己也不是很确定。也是两部,确定所有的状态,再确定状态如何转移。

  1. 包含三种状态,分别为 非冷冻(未持有) 冷冻(未持有) 持有
  2. 状态转移图
  3. 确定好这两点再去实现代码就不会乱套了

class Solution {
    public int maxProfit(int[] prices) {
        int[] stat = new int[3]; 
        // 三种状态 
        //分别为 非冷冻(未持有) 冷冻(未持有) 持有
        stat[0] = 0; stat[1] = 0; stat[2] = -1 * prices[0];

        for(int i = 1; i < prices.length; i++){
            stat[0] = Math.max(stat[0], stat[1]);  //当天非冷冻 前一天非冷冻|前一天冷冻
            stat[1] = stat[2] + prices[i-1]; //当天冷冻  一定是前一天持有
            stat[2] = Math.max(stat[2], stat[0]-prices[i]);  //当天持有   前一天持有|今天非冷冻
        }
        return Math.max(Math.max(stat[0], stat[1]), stat[2] + prices[prices.length-1]);
        //最后一天三种状态,非持有两种, 持有需要卖出再比较
    }
}

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

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

标签:Part09,stat,int,max,42,states,prices,Day,Math
From: https://www.cnblogs.com/12sleep/p/18357647

相关文章

  • P7561 [JOISC 2021 Day2] 道路の建設案 (Road Construction)
    这篇文章主要讲一下问什么要二分以后还要check(l-1),以及怎么找距离小于等于\(k\)的边的数量。题目给定\(n\)个点,求出任意两个点的曼哈顿距离的集合的前\(k\)大。思路我们先将曼哈顿距离转化为切比雪夫距离:我们知道形如\((x,y)\)点之间的曼哈顿距离等于\((x+y,......
  • 嵌入式软件--数据结构与算法 DAY 12
    数据结构和算法是程序的核心,虽然在嵌入式应用中很少会用到,但了解认知这种思维过程是非常有必要的。一个好的程序员应该把数据结构和算法看的比代码更重要。1.数据结构是什么?定义1(宏观):数据结构是为了高效访问数据而设计出的一种数据的组织和存储方式。定义2(微观):数据结构......
  • 嵌入式软件--数据结构与算法 DAY 13
    在嵌入式中,对算法的要求不高,但顺序查找和冒泡排序是经典算法,必须掌握。1.算法定义算法是一个用于解决特定问题的有限指令序列(计算机可以执行的操作)。通俗的理解就是可以解决特定问题的方法。2.时间复杂度时间复杂度不是执行完一段程序的总时间,而是描述为一个算法中基本操作......
  • javase-day06
    aFile_FileDemo01packagecom.se.aFile;/***绝对路径与相对路径的说明:*1.当前工作空间是/home/user/michael/**需求1:访问/home/user/michael/file1.txt*相对路径:file1.txt*绝对路径:/home/user/michael/file1.txt**需求2:访问/home/user/mi......
  • 实习记录day02:MySQL是有null和空的区别的
    实习第二天今天第一次骑电动车,平时不敢骑,但是这次来的路上实现没有单车,本人又不想走路X(,骑车无惊无险平安落地(撒花!)上午的时候被分配了一个小任务,优化一个逻辑,让一个不接受参数的死接口变成可接受参数的活接口。我本来想直接改原来的代码实现目的,一改突然就爆红了。原来这个se......
  • 代码随想录Day14
    226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内-100<=Node.val<=100......
  • D42 2-SAT+二进制枚举 P3825 [NOI2017] 游戏
    视频链接: P3825[NOI2017]游戏-洛谷|计算机科学教育新生态(luogu.com.cn)//2-SAT+二进制枚举O(2^8*(n+m))#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=100005;inthead[N],to[N<<1],ne[N<<1],idx;......
  • 无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智
    无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智能方案1.Dify简介1.1功能情况Dify,一款引领未来的开源大语言模型(LLM)应用开发平台,革新性地融合了后端即服务(BackendasaService,BaaS)与LLMOps的精髓,为开发者铺设了一条从创意原型到......
  • 代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳
    代码随想录算法训练营Day42代码随想录算法训练营第42天|LeetCode188.买卖股票的最佳时机IVLeetCode309.最佳买卖股票时机含冷冻期LeetCode714.买卖股票的最佳时机含手续费目录代码随想录算法训练营前言LeetCode188.买卖股票的最佳时机IVLeetCode309.最佳买卖......
  • Day 2:3107 使数组中位数等于k的最少操作数
    3107使数组中位数等于k的最少操作数1.题目描述2.解题思路3.代码实现1.题目描述3107使数组中位数等于k的最少操作数2.解题思路(1)对nums数组从小到大排序,注意到mid=nums.size()/2位置处的值为中位数;(2)判断中位数与k的大小关系:若中位数大于k,则向左依次......