题意:

image.png

解题思路:

  1. 思路:
  2. 状态: dp[i][0]表示第i天不持有股票的最大收益,dp[i][1]表示第i天持有股票的最大收益。
  3. 状态转移方程:
  4. 1、前一天不持有股票; 或者前一天持有股票,今天卖出,取大的
  5. dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
  6. 2、前一天持有股票;或者前一天不持有股票,今天买入,取大的
  7. dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
  8. 初始化:
  9. dp[0][0] = 0;dp[0][0]=0;dp[0][1] = -prices[0];
  10. 注意:买卖股票的最佳时机交易一次的区别,主要在状态转移方程上的差异,如下:
  11. dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
  12. dp[i][1] = max(dp[i - 1][1], -prices[i]);

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $prices
  4. * @return Integer
  5. */
  6. function maxProfit($prices) {
  7. if (empty($prices) || count($prices) == 0) return 0;
  8. $profit = 0;
  9. for($i = 1; $i < count($prices); $i++) {
  10. if ($prices[$i] > $prices[$i - 1]) {
  11. $profit += $prices[$i] - $prices[$i - 1];
  12. }
  13. }
  14. return $profit;
  15. }
  16. function maxProfitDp($prices) {
  17. if (empty($prices)) return 0;
  18. $dp = [];
  19. $dp[0][0] = 0;
  20. $dp[0][1] = -$prices[0];
  21. for ($i = 1; $i < count($prices); $i++) {
  22. $dp[$i][0] = max($dp[$i - 1][0], $dp[$i - 1][1] + $prices[$i]);
  23. $dp[$i][1] = max($dp[$i - 1][1], $dp[$i - 1][0] - $prices[$i]);
  24. }
  25. return $dp[count($prices)-1][0];
  26. }
  27. function maxProfit1($prices) {
  28. if (empty($prices) || count($prices) == 0) return 0;
  29. $profit = 0;
  30. $i = 0;
  31. $n = count($prices);
  32. while ($i < $n - 1) {
  33. //波谷
  34. while ($i < $n - 1 && $prices[$i+1] <= $prices[$i]) ++$i;
  35. $buyPrices = $prices[$i];
  36. //波峰
  37. while ($i < $n - 1 && $prices[$i+1] >= $prices[$i]) ++$i;
  38. $sellPrice = $prices[$i];
  39. $profit += ($sellPrice - $buyPrices);
  40. }
  41. return $profit;
  42. }
  43. }

GO代码实现:

  1. func maxProfit(prices []int) int {
  2. if len(prices) < 2 {
  3. return 0
  4. }
  5. dp := make([][2]int, len(prices))
  6. dp[0][0] = 0
  7. dp[0][1] = -prices[0]
  8. for i := 1; i < len(prices); i++ {
  9. dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])
  10. dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])
  11. }
  12. return dp[len(prices) - 1][0]
  13. }
  14. func max(a, b int) int {
  15. if a > b {return a}
  16. return b
  17. }
  18. func maxProfit(prices []int) int {
  19. sum := 0
  20. for i := 1; i < len(prices); i++ {
  21. if prices[i] - prices[i - 1] > 0 {
  22. sum += prices[i] - prices[i - 1]
  23. }
  24. }
  25. return sum
  26. }