代码随想三刷动态规划篇8
- 122. 买卖股票的最佳时机 II
- 题目
- 代码
- 123. 买卖股票的最佳时机 III
- 题目
- 代码
- 188. 买卖股票的最佳时机 IV
- 题目
- 代码
- 309. 买卖股票的最佳时机含冷冻期
- 题目
- 代码
122. 买卖股票的最佳时机 II
题目
链接
代码
class Solution {
public int maxProfit(int[] prices) {
if(prices.length==1){
return 0;
}
int[][] dp = new int[prices.length][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i =1;i<prices.length;i++){
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[prices.length-1][0];
}
}
123. 买卖股票的最佳时机 III
题目
链接
代码
class Solution {
public int maxProfit(int[] prices) {
if(prices.length==1){
return 0;
}
// 0 未持有
// 1 第一次持有
// 2 第一次未持有
// 3 第二次持有
// 4 第二次未持有
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][0]-prices[i]);
dp[i][2] = Math.max(dp[i-1][2],dp[i][1]+prices[i]);
dp[i][3] = Math.max(dp[i-1][3],dp[i][2]-prices[i]);
dp[i][4] = Math.max(dp[i-1][4],dp[i][3]+prices[i]);
}
return dp[prices.length-1][4];
}
}
188. 买卖股票的最佳时机 IV
题目
链接
代码
class Solution {
public int maxProfit(int k, int[] prices) {
if(prices.length==1){
return 0;
}
// 0 未持有
// 1 第一次持有
// 2 第一次未持有
// 3 第二次持有
// 4 第二次未持有
// ...
int[][] dp = new int[prices.length][k*2+1];
for(int i= 1;i<k*2+1;i+=2){
dp[0][i] = -prices[0];
}
for(int i =1;i<prices.length;i++){
for(int j =1;j<k*2+1;j+=2){
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]-prices[i]);
dp[i][j+1] = Math.max(dp[i-1][j+1],dp[i][j]+prices[i]);
}
}
return dp[prices.length-1][k*2];
}
}
309. 买卖股票的最佳时机含冷冻期
题目
链接
代码
class Solution {
public int maxProfit(int[] prices) {
if(prices.length==1){
return 0;
}
int[][] dp = new int[prices.length][2];
dp[0][1] = -prices[0];
dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
dp[1][1] = Math.max(dp[0][1], -prices[1]);
for(int i = 2;i<prices.length;i++){
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] + prices[i]);
dp[i][1] = Math.max(dp[i-1][1],dp[i-2][0]-prices[i]);
}
return dp[prices.length-1][0];
}
}