给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    分析:本题与1.0,2.0最大的不同是限制了交易次数,那么就需要dp数组有4种状态,于是就需要维护4个值
    dp[i][0] 指第一次买入股票
    dp[i][1] 指第一次抛出股票
    dp[i][2] 指第二次购买股票
    dp[i][3] 指第二次抛出股票
    递推公式与之前类似,一个不动,一个动起来!
    dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
    dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
    dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]-prices[i]);
    dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]+prices[i]);
    初值方面就有些坑了,之前有一次提交不过就是初值的问题,在本题中需要设立两个初值,一个是第一次买入股票的初值,一个是第二次买入股票的初值,二者都设为-prices[i],之前提交不过就在于第二次买入股票的初值设置为了0,导致后面递推的结果错误。
    关于会不会有第一次股票都没有买的情况,即类似[5,4,3,2,1]这种,不买即最大利润,即为0,这种情况在递推公式中其实也考虑在内了。在将状态1和3的初值设置为0之后,可以模拟看出,状态1和3的全部值均为0,即不进行操作,最终答案也为0

    参考代码:
    public int maxProfit(int[] prices) {
    int[][] dp = new int[prices.length][4];
    dp[0][0]=-prices[0];
    dp[0][2]=-prices[0];
    for(int i=1;i dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
    dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
    dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]-prices[i]);
    dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]+prices[i]);
    }
    return dp[prices.length-1][3];
    }