题意:

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、前一天持有股票;或者前一天不持有股票,今天买入, 因为只能交易一次,今天买入了说明前一天没有买卖,所以今天的收益是-prices[i]。取大的
  7. dp[i][1] = max(dp[i - 1][1], -prices[i]);
  8. 初始化:
  9. dp[0][0] = 0;//还没开始,利润为0
  10. dp[0][1] = -prices[0];
  11. 注意:
  12. 状态转移方程不是dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
  13. 初始化不能是最小值$dp[0][1] = PHP_INT_MIN,只能是买入花费的钱

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $prices
  4. * @return Integer
  5. */
  6. function maxProfit($prices) {
  7. if (count($prices) < 2) return 0;
  8. $maxProfit = 0;
  9. $buy = $prices[0];
  10. for ($i = 1; $i < count($prices); $i++) {
  11. if ($prices[$i] < $buy) {
  12. $buy = $prices[$i];
  13. } else {
  14. $maxProfit = max($maxProfit, $prices[$i] - $buy);
  15. }
  16. }
  17. return $maxProfit;
  18. }
  19. function maxProfitDp($prices) {
  20. if (empty($prices)) return 0;
  21. $dp = [];
  22. $dp[0][0] = 0;
  23. $dp[0][1] = -$prices[0];
  24. for ($i = 1; $i < count($prices); $i++) {
  25. $dp[$i][0] = max($dp[$i - 1][0], $dp[$i - 1][1] + $prices[$i]);
  26. $dp[$i][1] = max($dp[$i - 1][1], -$prices[$i]);
  27. }
  28. return $dp[count($prices) - 1][0];
  29. }
  30. }

GO代码实现:

  1. func maxProfit(prices []int) int {
  2. if len(prices) == 0 {
  3. return 0
  4. }
  5. min, profit, n := prices[0], 0, len(prices)
  6. for i := 1; i < n; i++ {
  7. if prices[i] < min {
  8. min = prices[i]
  9. } else if prices[i]-min > profit {
  10. profit = prices[i]-min
  11. }
  12. }
  13. return profit
  14. }