买卖股票问题3
dp 问题入门
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[3][prices.length];//定义二维数组
for(int i =1;i<=2;i++){//一层循环 次数
for(int j =1;j<prices.length;j++){//二层循环
for(int k = j-1;k>=0;k--){//k = 前j-1天;
int max = 0;//记录MAX
if(k == 0)//第一天买入
{
max = Math.max(dp[i][j-1],prices[j]-prices[k]);//k = 0
}
else{
max = Math.max(dp[i][j-1],prices[j]-prices[k]+dp[i-1][k-1]);//递推公式
}
dp[i][j] = Math.max(dp[i][j],max);
}
}
}
return dp[2][prices.length-1];
}
}
时间复杂n^2 * 2
优化
for(int k = j-1;k<j;k++){
}
2.
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int [3][prices.length];
for(int i = 1;i<=2;i++){
int max = Integer.MIN_VALUE/2;
for(int j = 1;j<prices.length;j++){
max = Math.max(max,dp[i-1][j-1]-prices[j-1]);
dp[i][j] = Math.max(dp[i][j-1],prices[j]+max);
}
}
return dp[2][prices.length-1];
}
}
3.三维
class Solution {
public int maxProfit(int[] prices) {
int [][][] dp = new int[prices.length][3][2];
dp[0][0][0] = 0;
dp[0][0][1] = -prices[0];
dp[0][1][0] = Integer.MIN_VALUE / 2;
dp[0][2][0] = Integer.MIN_VALUE /2;
dp[0][1][1] = Integer.MIN_VALUE /2;
dp[0][2][1] = Integer.MIN_VALUE /2;
for(int i = 1;i<prices.length;i++){
dp[i][1][0] = Math.max(dp[i-1][0][1]+prices[i],dp[i-1][1][0]);
dp[i][2][0] = Math.max(dp[i-1][1][1]+prices[i],dp[i-1][2][0]);
dp[i][0][1] = Math.max(dp[i-1][0][0]-prices[i],dp[i-1][0][1]);
dp[i][1][1] = Math.max(dp[i-1][1][0]-prices[i],dp[i-1][1][1]);
}
return Math.max(dp[prices.length-1][0][0],Math.max(dp[prices.length-1][1][0],dp[prices.length-1][2][0]));
}
}