题意理解。:
给定一个整数数组
prices
,其中第prices[i]
表示第i
天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
股票问题的升级问题,在卖出后存在一天的冷冻时间,不能进行交易。
股票这一类的问题都可以通过分析各个状态使用动态规划来解决这个问题。
四个状态:
1.持有股票的状态:包含当天买入
2.卖出后未买入的持续状态:冷冻天后,买入前
3.卖出天:包含当天卖出
4.冷冻天:不允许交易
解题思路:
(1)定义二维dp数组
dp[i][0]持有股票的状态
dp[i][1]卖出后未买入的持续状态
dp[i][2]卖出天
dp[i][3]冷冻天
(2)初始化
dp[0][0]=-prices[0]
第0天,其余三个状态属于非法状态,因为还没有买入。
(3)递归公式
dp[i][0]=max(持续持有,卖出非冷冻买入,冷冻后买入)=max(dp[i-1][0],dp[i][1]-prices[i],dp[i][3]-prices[i])
dp[i][1]=max(冷冻期延续, 卖出非冷冻期延续)=max(dp[i-1][3],dp[i-1][1])
dp[i][2]=前一天持有今日卖出=dp[i-1][0]+prices[i]
dp[i][3]=持续前一天卖出=dp[i-1][2]
1.解题
public int maxProfit(int[] prices) {
int[][] dp=new int[prices.length][4];
dp[0][0]=-1*prices[0];
dp[0][1]=0;
dp[0][2]=0;
dp[0][3]=0;
for(int i=1;i<prices.length;i++){
dp[i][0]=Math.max(dp[i-1][0],Math.max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][3]);
dp[i][2]=dp[i-1][0]+prices[i];
dp[i][3]=dp[i-1][2];
}
int max=0;
for(int i=0;i<4;i++) max=Math.max(dp[prices.length-1][i],max);
return max;
}
2.分析
时间复杂度:O(n)
空间复杂度:O(4n)