股票市场交易策略优化 | 豆包MarsCode AI刷题

119 阅读3分钟

本文旨在详解第80题股票市场交易策略优化,这道题是关于动态规划的题目,首先先了解题目:

股票市场交易策略优化 - MarsCode

在解决动态规划问题时,我们主要需要抓住以下几点:

定义状态:只有定义好了对应的状态,我们在书写解决问题的代码时才能将思路贯彻到代码中解决问题 转移方程:转移方程中包含了对于整个题目场景下的具体分析,我们需要根据题目的诸多限制定义转移方程解决问题

好了,让我们看一下这道题,这道题要求我们在一定时间内多次卖出股票进行交易来获得利润最大值,那么这种问题肯定需要遍历一遍给定数组,因此大致可以理解为这是一道线性dp的题目,有关于线性dp,其常规思路是定义为下面的二维数组:

int f[N][2]; 表示第i件物品选择(1)或者不选择(0)

其中第一维状态表示题目给定的天数或者物品数的数据范围,第二维状态根据题目含义进行具体指定,例如在本题中,除了定义卖出与买入两种状态外,由于卖出股票后存在一天的冷冻期,所以我们还需要定义第三维状态,所以我们可以定义数组f[N][3]来表示状态,其各个维度定义如下:

f[i][0]:表示买入股票,这一天会减去买股票花费的金额 f[i][1]:表示卖出股票第一天,这一天会加上卖出股票赚取的费用,但是这一天不能买入股票 f[i][2]:表示卖出股票第二天,这一天之后可以买入股票

因此定义好了状态后,我们再根据状态含义定义转移方程:

对于f[i][0],由于是买入股票,因此状态转移方程为:f[i][0]=Math.max(f[i-1][0],f[i-1][2]-stocks[i-1]);,对于f[i][1],这一天是卖出股票,因此状态转移方程为:f[i][1]=f[i-1][0]+stocks[i-1];,对于f[i][2],这一天后可以继续买入股票,因此状态转移方程为:f[i][2]=Math.max(f[i-1][1],f[i-1][2]);,之后书写代码,遍历一遍所有股票,那么问题就解决了!

代码如下:

public class Main {
    public static int solution(int[] stocks) {
        // Please write your code here
        int n=stocks.length;
        //1表示无货第一天,2表示无货第二天
        int[][] f = new int[n+1][3];
        for(int i=0;i<=n;i++)
            for(int j=0;j<3;j++)
                f[i][j]=-0x3f3f3f3f;
        for(int i=0;i<=n;i++)
            f[i][1]=f[i][2]=0;
        for(int i=1;i<=n;i++) {
            f[i][0]=Math.max(f[i-1][0],f[i-1][2]-stocks[i-1]);
            f[i][1]=f[i-1][0]+stocks[i-1];
        f[i][2]=Math.max(f[i-1][1],f[i-1][2]);
        }
        return Math.max(f[n][1], f[n][2]);
    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution(new int[]{1, 2}) == 1);
        System.out.println(solution(new int[]{2, 1}) == 0);
        System.out.println(solution(new int[]{1, 2, 3, 0, 2}) == 3);
        System.out.println(solution(new int[]{2, 3, 4, 5, 6, 7}) == 5);
        System.out.println(solution(new int[]{1, 6, 2, 7, 13, 2, 8}) == 12);
    }
}

通过这道题,我们对于线性dp有了更加深刻的认识,在面对这类问题时,如何根据题目的限制定义状态是关键,定义好了状态之后,那么我们再书写状态转移方程时那么也就没有那么困难了

这里分享几个洛谷上的线性dp优秀题目,大家可以学以致用,举一反三:

www.luogu.com.cn/problem/P10… 单调的线性dp问题解决方案

www.luogu.com.cn/problem/P15… 很有意思的定义状态的方式

www.luogu.com.cn/problem/P18… 融合了贪心思想

希望对你有所帮助!!!