股票的买卖III

股票的买卖,运用动态规划

每一天的状态有五种:

0 : 不操作

1:第一次买入

2:第一次卖出

3:第二次买入

4:第二次卖出

dp[i][0] 表示第i天的不操作的最大收益


dp[i][1] 表示第i天的第一次买入的最大收益


dp[i][2] 表示第i天的第一次卖出的最大收益


dp[i][3] 表示第i天的第二次买入的最大收益


dp[i][4] 表示第i天的第二次卖出的最大收益

初始化:

dp[0][0] = 0 表示不赚不赔

dp[0][1] = -prices[0] 表示买入了损失了第一天的价钱

dp[0][2] = 0 表示卖出了收益的钱,因为买入又卖出,所以收益为0

dp[0][3] = -prices[0] 表示买入了损失了第一天的价钱

dp[0][4] = 0 表示卖出了收益的钱,因为买入又卖出,所以收益为0

 

转移方程和前一天的子问题有关系或者是本身,取最大值。

 

package com.lhb.bytedance;

/**
 * @author lhb
 * @date 2022/3/12
 */
public class SoldTheStackII {
    private static int soldStack(int[] nums) {
        int[][] dp = new int[nums.length][5];
        dp[0][0] = dp[0][2] = dp[0][4] = 0;
        dp[0][1] = dp[0][3] = -nums[0];
        for (int i = 1; i < nums.length; i++) {
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = Math.max(dp[i - 1][0] - nums[i], dp[i - 1][1]);
            dp[i][2] = Math.max(dp[i - 1][1] + nums[i], dp[i - 1][2]);
            dp[i][3] = Math.max(dp[i - 1][2] - nums[i], dp[i - 1][3]);
            dp[i][4] = Math.max(dp[i - 1][3] + nums[i], dp[i - 1][4]);
        }
        return dp[nums.length - 1][4];
    }
    public static void main(String[] args) {
        int[] nums = {7,6,4,3,1};
        System.out.println(soldStack(nums));
    }
}

 

posted @ 2022-03-12 16:12  牵魂  阅读(15)  评论(0)    收藏  举报