这篇page是针对leetcode上的309.最佳买卖股票时机含冷冻期。小尼先简单的说明一下这道题的意思,就是我们给定一个整数数组prices,其中第prices[i]表示第i天股票价格,我们需要设计一个算法算出最大的利润,我们需要满足的要求是我们再卖出股票的后一天我们的股票会进入冷冻期,也就是一旦我们将一个股票交易完了之后的一天我们无法进行任何操作,直接进入冷冻期。
小尼简单的分析一下这道题,其实这道题还是比较简单的,其实我们做的操作永远都是只有两步,一步是对股票进行买入,一步是对股票进行卖出。
小尼接下来写出这里的动态规划五部曲:
1、确定dp[i][j]数组的含义:我们在这里设定两个状态分别是0和1,其中0的状态表示的是卖出的状态,1的状态表示的是买入的状态。
2、确定递归公式:我们在这里其实卖出操作就跟小尼之前所写的几篇文章类似,但是这里的买入操作就是有一些区别,因为在这里设定了一个冷冻期的限制,我们在平常对买入的操作就是只有两种情况,第一种就是我们接着上一次买入了的股票的状态,第二种就是我们可以在昨天还是卖出的状态进行买入,但是我们在这里我们不能直接从昨天卖出后在今天直接进行买入,所以我们这里列出的递推公式就是:dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = Math.max(dp[i-1][1], dp[i-2][0] - prices[i])
3、对dp数组进行对应的初始化:我们可以从上面的递推公式可以看出,当我们进行买入操作的时候的可选项是有两个的,其中一个就是直接拿着昨天已经买入的数组,第二个选择就是我们在两台你之前已经卖出的金额在今天进行对应的购买,但是我们对一个物品进行买入的时候,我们没有-1这个数据,所以前面的数据都需要我们进行对应的手动操作,dp[0][0]=0,dp[0][1] = -prices[i],dp[1][0]=Math.max(dp[0][0],dp[0][1] + prices[1]),dp[1][1]=Math.max(dp[0][1], -prices[1])
4、确定递归顺序:我们通过观察题目可以知道,我们的递归顺序应该是从前往后进行
5、导出我们的dp数组
小尼接下来拉一下这道题的解题的代码:
class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length < 2){
return 0;
}
int[][] dp = new int[prices.length][2];
//当j为0时我们设置的状态是卖出的状态
//当j为1时我们设置的状态时买入的状态
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
dp[1][1] = Math.max(dp[0][1], -prices[1]);
for(int i = 2; i < prices.length; i++){
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);
dp[i][1] = Math.max(dp[i-1][1], dp[i-2][0] - prices[i]);
}
return dp[prices.length-1][0];
}
}
小尼简单的说明一下这道题的代码题解,其实还是比较简单的,就是根据小尼上面所写的先将我们的数组进行对应的初始化,然后再最我们给出的股票数组进行对应的遍历循环。
希望上面的代码可以帮助到小伙伴们~~~