题目链接:LeeCode309买卖股票的最佳时机
题目描述:
这个题真的卡了我好久,之前没做过类似的题目,看了题解才知道有状态机这个概念,得考虑多个状态,然后说说解题思路:
思路
买卖股票过程中一定会有两种状态,现在 手里面有股票/手里面没股票
当手里面有股票时,有两种情况
1.手里得股票是今天买的,那当前利润就是前天(今天减两天,因为有冷冻期)卖的最大利润减今天买股票花费的钱。
2.手里的股票是昨天就有的,至于到底什么时候买的无所谓,当前利润就是昨天时候的利润
当手里面没股票时,也有两种情况
1.今天把股票卖了,那利润就是昨天拥有股票时候的利润加今天卖股票所得利润
2.昨天手里就没有股票,今天也没买,利润就是昨天的利润
整理
上面两种情况需要用两个数组存,也就是dp[0][i]和dp[1][i]
每次取两种情况里面较大的,最后取两个情况最后一天谁最赚
class Solution {
public static int maxProfit(int[] prices) {
if(prices.length==0)return 0;
int[][] dp=new int[2][prices.length];
//第一天有股票肯定是买来的,所以初始化必须把钱花了
dp[0][0]=0-prices[0];
//第一天没股票,也就是不买
dp[1][0]=0;
for (int i = 1; i < prices.length; i++) {
//手里有股票时
//当i-2小于二的时候应该尝试买最便宜的一只股票
dp[0][i]=Math.max(dp[0][i-1],i-2>=0?dp[1][i-2]-prices[i]:0-prices[i]);
//手里没股票时
dp[1][i]=Math.max(dp[0][i-1]+prices[i],dp[1][i-1]);
}
return Math.max(dp[0][prices.length-1],dp[1][prices.length-1]);
}
}