class Solution {
public int maxProfit(int[] prices) {
int[] dp=new int[4];
dp[0]=-prices[0];//第一次持有
dp[1]=0;
dp[2]=-prices[0];//第二次持有
dp[3]=0;
for(int i=1;i<prices.length;i++){
dp[0]=Math.max(dp[0],-prices[i]);
dp[1]=Math.max(dp[1],dp[0]+prices[i]);
dp[2]=Math.max(dp[2],dp[1]-prices[i]);
dp[3]=Math.max(dp[3],dp[2]+prices[i]);
}
return dp[3];
}
}
k次买卖,两个维度的初始化,第一天买卖初始化,以及dp[0-1]的初始化,这样才能写j的递推
因为i和j都是变量,所以要有两个初始化
class Solution {
public int maxProfit(int k, int[] prices) {
int[] dp=new int[2*k];//持有和不持有状态
int len=prices.length;
for(int i=0;i<=2*k-1;i+=2){
dp[i]=-prices[0];//第一天买入情况,初始化
}
for(int i=1;i<len;i++){
dp[0]=Math.max(dp[0],-prices[i]);//第i天的初始化
dp[1]=Math.max(dp[1],dp[0]+prices[i]);
for(int j=2;j<=2*k-1;j+=2){
dp[j]=Math.max(dp[j],dp[j-1]-prices[i]);//持有
dp[j+1]=Math.max(dp[j+1],dp[j]+prices[i]);//不持有
}
}
return dp[2*k-1];
}
}