动态规划解法思路:
1.先声明一个二维dp数组来记录每一个下标的的状态,例如:没有买一次操作,买了第一次操作,卖了第一次没买第二次操作,买第二次操作,卖了第二次操作。
2.初始化dp数组的dp【0】【1】=-prices【0】和dp【0】【3】=-prices【0】。再用for循环来进行遍历全部的dp数组,递推公式: 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]);
dp[i][4]=Math.max(dp[i-1][4],dp[i-1][3]+prices[i]);最后返回最后一个下标的两次全部交易的dp数组dp【length-1】【4】,表示整个dp数组中两次交易全部完成的最大利润。
class Solution {
public int maxProfit(int[] prices) {
//声明一个dp数组来表示股票每个过程的状态,有没有买一次的操作,买了第一次的操作,卖了第一次后没买第二次的操作,卖了第一次卖了第二次的操作,卖了第二次的操作
int [][] dp=new int[prices.length][5];
//买了第一次的操作
dp[0][1]=-prices[0];
//卖了第一次卖了第二次的操作
dp[0][3]=-prices[0];
for(int i=1;i<prices.length;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]);
//推导每一个下标卖了第二次的操作的最大利润
dp[i][4]=Math.max(dp[i-1][4],dp[i-1][3]+prices[i]);
}
//返回最后一个下标的两次交易全部完成的最大利润
return dp[prices.length-1][4];
}
}