Day49题目
LeetCode123买卖股票三
核心思想:和昨天的买卖股票相比,这个只允许买两次,因此把状态新增几个,可见代码注释
java
class Solution {
public int maxProfit(int[] prices) {
// 设置五个状态 0 : 无操作 , 1 : 第一次买入, 2 : 第一次卖出 , 3: 第二次买入, 4:第二次卖出
// 这几个状态都是持续性的,表示目前进行到了哪个阶段,而不是当前天的动作
int[][] dp = new int[prices.length][5];
dp[0][0] = 0 ;
dp[0][1] = -prices[0];
dp[0][2] = 0;
dp[0][3] = -prices[0];
dp[0][4] = 0;
for(int i = 1 ; i < prices.length ; i ++){
dp[i][0] = 0;
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];
}
}
LeetCode188买卖股票四
核心思想:和上面题目不同的是,你最多可以买K次股票,因此需要有2*k+1个状态,选择奇数为买入,偶数为卖出
java
class Solution {
public int maxProfit(int k, int[] prices) {
// 奇数为买入
// 偶数为卖出
int[][] dp = new int[prices.length][2*k+1];
for(int i = 1 ; i < 2*k+1 ; i +=2){
dp[0][i] = -prices[0];
}
for(int i = 1 ; i < prices.length ; i ++){
for(int j = 1; j < 2*k+1; j +=2 ){
dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-1] - prices[i]);
dp[i][j+1] = Math.max(dp[i-1][j+1], dp[i-1][j] + prices[i]);
}
}
return dp[prices.length-1][2*k];
}
}