代码随想录训练营第51天|309.买卖股票的最佳时机含冷冻期,714.买卖股票的最佳时机含手续费
309.买卖股票的最佳时机含冷冻期
文章
思路
分3种状态,持有股票、刚卖掉、不持有且非冷冻期
d
p
[
i
]
[
0
]
=
M
a
x
(
d
p
[
i
−
1
]
[
0
]
,
d
p
[
i
−
1
]
[
2
]
−
p
r
i
c
e
s
[
i
]
)
d
p
[
i
]
[
1
]
=
d
p
[
i
−
1
]
[
0
]
+
p
r
i
c
e
s
[
i
]
d
p
[
i
]
[
2
]
=
M
a
x
(
d
p
[
i
−
1
]
[
1
]
,
d
p
[
i
−
1
]
[
2
]
)
dp[i][0]=Max(dp[i-1][0],dp[i-1][2]-prices[i])\\dp[i][1]=dp[i-1][0]+prices[i]\\dp[i][2]=Max(dp[i-1][1],dp[i-1][2])
dp[i][0]=Max(dp[i−1][0],dp[i−1][2]−prices[i])dp[i][1]=dp[i−1][0]+prices[i]dp[i][2]=Max(dp[i−1][1],dp[i−1][2])
代码
class Solution {
public int maxProfit(int[] prices) {
int i, n;
n = prices.length;
int[][] dp = new int[n][3]; //dp[i][0] 持有, dp[i][1] 不持有且冷冻期, dp[i][2] 不持有且非冷冻期
dp[0][0] = -prices[0];
for (i = 1; i < n; ++i) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2] prices[i]);
dp[i][1] = dp[i - 1][0] + prices[i];
dp[i][2] = Math.max(dp[i - 1][1], dp[i - 1][2]);
}
return Math.max(dp[n - 1][1], dp[n - 1][2]);
}
}
714.买卖股票的最佳时机含手续费
文章
思路
卖出时收手续费
其余同122题
代码
class Solution {
public int maxProfit(int[] prices, int fee) {
int i, n;
n = prices.length;
int[] dp = new int[2]; // 0 持有,1 不持有
dp[0] = -prices[0];
int dp0, dp1;
for (i = 1; i < n; ++i) {
dp0 = Math.max(dp[0], dp[1] - prices[i]);
dp1 = Math.max(dp[1], dp[0] + prices[i] - fee);
dp[0] = dp0;
dp[1] = dp1;
}
return dp[1];
}
}
总结
309还是要思考一下状态转移的
714完全就是举一反三了