LeeCode309买卖股票的最佳时机(Java)(dp状态机)

题目链接:LeeCode309买卖股票的最佳时机
题目描述:LeeCode309买卖股票的最佳时机(Java)(dp状态机)_第1张图片
这个题真的卡了我好久,之前没做过类似的题目,看了题解才知道有状态机这个概念,得考虑多个状态,然后说说解题思路:

思路

买卖股票过程中一定会有两种状态,现在 手里面有股票/手里面没股票

手里面有股票时,有两种情况

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]);
    }
}

你可能感兴趣的:(leecode,leetcode,算法,数据结构,状态机,动态规划)