From 94b4a156b1c5221707b004d4ebd5f89d50d4f2e8 Mon Sep 17 00:00:00 2001 From: YuzeZhang Date: Tue, 23 Jun 2020 13:15:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E7=85=A7=E4=BD=9C=E8=80=85=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E7=94=A8C++=E5=AE=9E=E7=8E=B0=E7=9A=846=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E5=9B=A2=E7=81=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\245\250\351\227\256\351\242\230.md" | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git "a/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\233\242\347\201\255\350\202\241\347\245\250\351\227\256\351\242\230.md" "b/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\233\242\347\201\255\350\202\241\347\245\250\351\227\256\351\242\230.md" index 9d800e9..6bd0de9 100644 --- "a/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\233\242\347\201\255\350\202\241\347\245\250\351\227\256\351\242\230.md" +++ "b/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\233\242\347\201\255\350\202\241\347\245\250\351\227\256\351\242\230.md" @@ -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& 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& 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& 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& 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& 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 &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) -- GitLab