股票的买卖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)); } }

浙公网安备 33010602011771号