首页 > 其他分享 >Day 41 动态规划 Part09 开始炒股

Day 41 动态规划 Part09 开始炒股

时间:2024-08-12 23:28:59浏览次数:8  
标签:Part09 stat int max 41 states prices Day Math

动态规划解题步骤

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

121. 买卖股票的最佳时机

这道题虽然自己做出来了,但是做了后面的题再回头看它就有了不一样的理解。curMin更重要的代表了一种状态,代表遍历到当前时间时最低的股价。本质上curMin也应该是一个和prices等长的数组,表示了每天的状态(这就是这道题动态规划思路体现的位置),只是由于每天的状态都由前一天完全确定,且我们最终也只需要最后一天的结果,所以空间上可以优化成O(1)

class Solution {
    public int maxProfit(int[] prices) {
        int curMin = prices[0];
        int max = 0;
        for(int i = 0; i < prices.length; i++){
            int profit = prices[i] - curMin;
            max = Math.max(max, profit);
            curMin = Math.min(curMin, prices[i]);
        }
        return max;
    }
}

122. 买卖股票的最佳时机 II

这道题给了我一种贪心的感觉,收获每个正收益即可。

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

动态规划的版本代码先放在这里,看了下一道题再看就非常易懂了。

class Solution {  //动态规划版本
    public int maxProfit(int[] prices) {
        int[] stat = new int[2];
        stat[0] = Integer.MIN_VALUE;
        for(int i = 0; i < prices.length; i++){
            stat[0] = Math.max(stat[0], stat[1] - prices[i]);
            stat[1] = Math.max(stat[1], stat[0] + prices[i]);
        }
        return stat[1];
    }
}

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

这道题和188. 买卖股票的最佳时机 IV可以说一模一样,就按照k次买入卖出来做,对于本题取k=2即可。

最主要的就是要描述每天的状态,每天可以有多少种状态呢?对于最多k次交易,我们可以想到有第1次买入,第1次卖出 ... 第k次买入,第k次卖出共有2*k次状态。因此dp数组形状应该是k * n,确定了dp数组就去考虑如何更新dp数组就好了。

这里更详细解释下dp[i][j]的含义:第j天状态为i时的最大利润,一定仔细仔细理解这句话。

注意看下面这个表格中所有的状态:第一次买入代表当前还持有第一次买入的股票,可以是当天买的,也可以是之前买入的。其他状态的理解也是这样。

day1 2 ... day n
第一次买入
第一次卖出
...
第k次买入
第k次卖出
// 188
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];
    }
}


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

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

相关文章

  • AtCoder Regular Contest 041 D 辺彩色
    洛谷传送门AtCoder传送门比较有意思的小清新题。第一步是时光倒流,看成是每次经过一条未被访问过的边才染色。奇偶相关容易想到二分图。发现若有一个黑白交替的奇环(即从一个点开始遍历完整个环得到的颜色序列是黑白交替地),那我们可以先染完这个环。又因为它是奇环,所以我们遍历......
  • 「Day 7—离散化 & 树状数组 & 线段树」
    离散化定义离散化本质是一种哈希,是一种用来处理数据的方法。1.创建原数组的副本。2.将副本中的值从小到大排序。3.将排序好的副本去重。4.查找原数组的每一个元素在副本中的位置,位置即为排名,将其作为离散化后的值。B3694数列离散化代码#include<iostream>#include<algo......
  • 青甘环线游记|day(9~10)|祁连山大草原、黄河
    祁连山大草原祁连山的平均山脉海拔在4000米~5000米之间,高山积雪形成的硕长而宽阔的冰川地貌奇丽壮观。海拔高度在4000米以上的地方,称为雪线,祁连山的雪线之上,常常会出现逆反的生物奇观。在浅雪的山层之中,有名为雪山草甸植物的蘑菇状蚕缀,还有珍贵的药材——高山雪莲,以及一种......
  • 8.12 Day5
    推荐歌曲《我是逆蝶》。ADivideSquare挖掘特殊点:有一个端点在边缘上。如果我们扫x坐标,维护lst横和交叉的竖,非常不好维护,并且TLE。结论:一个交点会至少增加一个区域。证明显然。当然还有一点cornercase。BCowTennisTournament一开始想的是三元环会是怎的,推出的......
  • 代码随想录Day12
    二叉树遍历分为前序、中序、后续、层序四种其中前中后序属于深度优先搜索,层序属于广度优先搜索前序遍历顺序:根节点->左子树->右子树中序遍历顺序:左子树->根节点->右子树后序遍历顺序:左子树->右子树->根节点不难发现,前中后其实就是根节点在遍历中的位置至于层序遍历,顾名......
  • LinkedHashSet day14
    /*LinkedHashSet是继承自HashSet类,底层数据结构是哈希表和双链表,哈希表保证了元素的唯一性,双链表保证了元素的有序Collection:接口-List(元素有序且可以发生重复,且有索引的概念)-ArrayList(底层数据结构是数组,查询快,增删慢,线程......
  • 【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain
    【单调栈+倍增】[P7167[eJOI2020Day1]Fountain思路用单调栈处理每个圆盘溢出后流到的第一个位置,然后倍增优化。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • 鸿蒙-JS-第二周day01
    数组1什么是数组1)数组是值的有序集合。2)每个值叫做一个元素。3)每个元素在数组中有一个位置,以数字表示,称为索引(有时也称为下标)。4)数组的元素可以是任何类型。5)数组索引从0开始,数组最大能容纳4294967295个元素。2创建数组2.1使用数组直接量//......
  • 实习记录day01
    实习第一天上午:没想到提示的走路1.6公里这么远,差点迟到,公司离地铁站好远,下次要骑车过来,想不到这次居然把我腿走断了,一上午还没有恢复过来。(现在下午了,也没恢复过来)这个地方的电梯真离谱,居然是两面开的,我嗯了半天还以为这个电梯坏了,真绝了。配置了公司内网的相关软件,为了链接内......
  • 日撸Java三百行(day20:小结)
    目录前言一、面向对象和面向过程相比,有哪些优势?1.封装2.继承3.多态4.协作5.组织结构二、比较顺序表和链表的异同1.相同点2.不同点2.1物理存储结构2.2查找2.3插入和删除三、分析顺序表和链表的优缺点1.顺序表1.1顺序表的优点1.2顺序表的缺点2.链表2.1链表的......