提交 94b4a156 编写于 作者: Y YuzeZhang 提交者: labuladong

按照作者算法用C++实现的6股票团灭

上级 ed8e311c
......@@ -394,6 +394,7 @@ int maxProfit_k_any(int max_k, int[] prices) {
[Hanmin](https://github.com/Miraclemin/) 提供 Python3 代码:
**第一题,k = 1**
```python
def maxProfit(self, prices: List[int]) -> int:
dp_i_0,dp_i_1 = 0,float('-inf')
......@@ -403,6 +404,7 @@ def maxProfit(self, prices: List[int]) -> int:
return dp_i_0
```
**第二题,k = +infinity**
```python
def maxProfit_k_inf(self, prices: List[int]) -> int:
dp_i_0,dp_i_1 = 0,float('-inf')
......@@ -413,6 +415,7 @@ def maxProfit_k_inf(self, prices: List[int]) -> int:
return dp_i_0
```
**第三题,k = +infinity with cooldown**
```python
def maxProfit_with_cool(self, prices: List[int]) -> int:
dp_i_0,dp_i_1 = 0,float('-inf')
......@@ -435,6 +438,7 @@ def maxProfit_with_fee(self, prices: List[int], fee: int) -> int:
return dp_i_0
```
**第五题,k = 2**
```python
def maxProfit_k_2(self, prices: List[int]) -> int:
dp_i10,dp_i11 = 0,float('-inf')
......@@ -447,6 +451,7 @@ def maxProfit_k_2(self, prices: List[int]) -> int:
return dp_i20
```
**第六题,k = any integer**
```python
def maxProfit_k_any(self, max_k: int, prices: List[int]) -> int:
n = len(prices)
......@@ -470,6 +475,154 @@ def maxProfit_k_any(self, max_k: int, prices: List[int]) -> int:
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
return dp[n - 1][max_k][0];
```
[z2z23n0](https://github.com/YuzeZhang/) 提供 C++ 代码:
**第一题,k = 1**
```c++
int maxProfit(vector<int>& prices) {
int n = prices.size();
// base case
int dp_i_0 = 0, dp_i_1 = INT_MIN;
// dp_i_0: 第i天的最大利润, 0表示不持有股票
// dp_i_1: 第i天的最大利润, 1表示持有股票
for (int i = 1; i <= n; i++) {
// 如果今天不持有股票,表示昨天也不持有股票或是今天卖掉了股票
dp_i_0 = max(dp_i_0, dp_i_1 + prices[i - 1]);
// 如果今天持有股票,表示昨天就持有股票或是今天买了股票
dp_i_1 = max(dp_i_1, -prices[i - 1]);
}
return dp_i_0;
}
```
**第二题,k = +infinity**
```c++
int maxProfit(vector<int>& prices) {
int n = prices.size();
// base case
int dp_i_0 = 0, dp_i_1 = INT_MIN;
// dp_i_0: 第i天的最大利润, 0表示不持有股票
// dp_i_1: 第i天的最大利润, 1表示持有股票
for (int i = 1; i <= n; i++) {
int temp = dp_i_0;
// 如果今天不持有股票,表示昨天也不持有股票或是今天卖掉了股票
dp_i_0 = std::max(dp_i_0, dp_i_1 + prices[i - 1]);
// 如果今天持有股票,表示昨天就持有股票或是今天买了股票
dp_i_1 = std::max(dp_i_1, temp - prices[i - 1]);
}
return dp_i_0;
}
```
**第三题,k = +infinity with cooldown**
```c++
int maxProfit(vector<int>& prices) {
int n = prices.size();
// base case
// dp_i_0: 第i天的最大利润, 0表示不持有股票
// dp_i_1: 第i天的最大利润, 1表示持有股票
int dp_i_0 = 0, dp_i_1 = INT_MIN;
// 表示第(i-2)天的最大利润,并且未持有股票
int prev_dp_i_0 = 0;
for (int i = 1; i <= n; i++) {
// temp和prev_dp_i_0用来记录第(i-2)天(前天)的最大利润
int temp = dp_i_0;
// 如果今天不持有股票,表示昨天也不持有股票或是今天卖掉了股票
dp_i_0 = std::max(dp_i_0, dp_i_1 + prices[i - 1]);
// 如果今天持有股票,表示昨天就持有股票或是今天买了股票
dp_i_1 = std::max(dp_i_1, prev_dp_i_0 - prices[i - 1]);
prev_dp_i_0 = temp;
}
return dp_i_0;
}
```
**第四题,k = +infinity with fee**
```c++
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
// base case
int dp_i_0 = 0, dp_i_1 = INT_MIN;
// dp_i_0: 第i天的最大利润, 0表示不持有股票
// dp_i_1: 第i天的最大利润, 1表示持有股票
for (int i = 1; i <= n; i++) {
int temp = dp_i_0;
// 如果今天不持有股票,表示昨天也不持有股票或是今天卖掉了股票
dp_i_0 = std::max(dp_i_0, dp_i_1 + prices[i - 1]);
// 如果今天持有股票,表示昨天就持有股票或是今天买了股票
//tips:为什么不在卖股票的时候减掉transaction fee?因为在base case中, dp_i_1 == INT_MIN, INT_MIN + prices[i] - fee 可能会造成整型溢出
dp_i_1 = std::max(dp_i_1, temp - prices[i - 1] - fee);
}
return dp_i_0;
}
```
**第五题,k = 2**
```c++
int maxProfit(vector<int>& prices) {
int size = prices.size();
int max_k = 2;
// i从1开始而不是0,这样可以使base case是 dp[0][0][0] 和 dp[0][0][1] 而不是 dp[-1][0][0] 或者 dp[-1][0]
int dp[size + 1][max_k + 1][2];
// 初始化
for (int k = max_k; k >= 0; k--) {
dp[0][k][0] = 0;
dp[0][k][1] = INT_MIN;
}
for (int i = 1; i <= size; i++) {
dp[i][0][0] = 0;
dp[i][0][1] = INT_MIN;
for (int k = max_k; k >= 1; k--) {
dp[i][k][0] = std::max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i - 1]);
dp[i][k][1] = std::max(dp[i - 1][k][1], dp[i - 1][k - 1][0] - prices[i - 1]);
}
}
return dp[size][max_k][0];
}
```
**第六题,k = any integer**
```c++
int maxProfit(int k, vector<int> &prices) {
int size = prices.size();
if (k > size / 2) {
return maxProfitLimitless(prices);
}
// i从1开始而不是0,这样可以使base case是 dp[0][0][0] 和 dp[0][0][1] 而不是 dp[-1][0][0] 或者 dp[-1][0][1]
int dp[size + 1][k + 1][2];
// 初始化
for (int j = k; j >= 0; j--) {
dp[0][j][0] = 0;
dp[0][j][1] = INT_MIN;
}
for (int i = 1; i <= size; i++) {
dp[i][0][0] = 0;
dp[i][0][1] = INT_MIN;
for (int j = k; j >= 1; j--) {
dp[i][j][0] = std::max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i - 1]);
dp[i][j][1] = std::max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i - 1]);
}
}
return dp[size][k][0];
}
```
[上一篇:动态规划之KMP字符匹配算法](../动态规划系列/动态规划之KMP字符匹配算法.md)
[下一篇:团灭 LeetCode 打家劫舍问题](../动态规划系列/抢房子.md)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册