股票问题总结篇

股票问题总结

  • 动态规划:121.买卖股票的最佳时机
  • 动态规划:122.买卖股票的最佳时机II
  • 动态规划:123.买卖股票的最佳时机III
  • 动态规划:188.买卖股票的最佳时机IV
  • 动态规划:309.最佳买卖股票时机含冷冻期
  • 动态规划:714.买卖股票的最佳时机含手续费

动态规划:121.买卖股票的最佳时机

股票只能买卖一次,买入股票时手上的现金一定为0
动态规划五步曲:

  • ① 确定dp[i][j]的含义 :
    第i天持有这个股票的最大金额dp[i][0],第i个天不持有这个股票的最大金额dp[i][1];
    第i-1天持有这个股票的最大金额dp[i-1][0],第i-1个天不持有这个股票的最大金额dp[i-1][1]。
  • ② 求递推公式 :
    一直持有 / 第i天买入 取最大
    dp[i][0] = max(dp[i-1][0], -price[i])
    一直未持有 / 第i天卖出 取最大
    dp[i][1] = max(dp[i-1][1], dp[i-1][0]+price[i])
  • ③ dp数组如何初始化 :
    dp[0][0] = -price[0] dp[0][1] = 0

动态规划:122.买卖股票的最佳时机II

股票可以买卖多次,在买入股票时手上的现金不一定为0
动态规划五步曲:

  • ① 确定dp[i][j]的含义 :
    第i天持有这个股票的最大金额dp[i][0],第i个天不持有这个股票的最大金额dp[i][1];
    第i-1天持有这个股票的最大金额dp[i-1][0],第i-1个天不持有这个股票的最大金额dp[i-1][1]。
  • ② 求递推公式 :
    • 一直持有 / (第i-1必须未持有)第i天买入 取最大
      dp[i][0] = max(dp[i-1][0],dp[i-1][1] - price[i])
    • 一直未持有 / (第i-1必须持有)第i天卖出 取最大
      dp[i][1] = max(dp[i-1][1], dp[i-1][0]+price[i])
  • ③ dp数组如何初始化 :
    dp[0][0] = -price[0] dp[0][1] = 0

动态规划:123.买卖股票的最佳时机III

只能至多买卖两次且不能同时参与多笔交易。

  • 动态规划五步曲:
  • ① 确定dp[i]的含义 :
    第 i 天 不操作 的最大金额dp[i][0],
    第 i天 第一次持有 这个股票的最大金额dp[i][1],
    第 i 天 第一次不持有 这个股票的最大金额dp[i][2],
    第 i 天 第二次持有 这个股票的最大金额dp[i][3],
    第 i 天 第二次不持有 这个股票的最大金额dp[i][4]。
  • ② 求递推公式 :
    dp[i][0] = dp[i-1][0] ----- 为0
    dp[i][1] = max(dp[i-1][1], dp[i-1][0] - price[i])
    dp[i][2] = max(dp[i-1][2], dp[i-1][1] + price[i])
    dp[i][3] = max(dp[i-1][3], dp[i-1][2] - price[i])
    dp[i][4] = max(dp[i-1][4], dp[i-1][3] + price[i])
  • ③ dp数组如何初始化 :
    dp[0][0] = 0 dp[0][1] = -price[0] dp[0][2] = 0
    dp[0][3] = -price[0] dp[0][4] = 0

动态规划:188.买卖股票的最佳时机IV

只能至多买卖k次且不能同时参与多笔交易。
动态规划五步曲:

  • ① 确定dp[i]的含义 :
    第 i 天 不操作 的最大金额dp[i][0],
    第 i天 第一次持有 这个股票的最大金额dp[i][1],
    第 i 天 第一次不持有 这个股票的最大金额dp[i][2],
    第 i 天 第k次持有 这个股票的最大金额dp[i][2k-1],
    第 i 天 第k次不持有 这个股票的最大金额dp[i][2k]。
  • ② 求递推公式 :
    dp[i][0] = dp[i-1][0] ----- 为0
    dp[i][1] = max(dp[i-1][1], dp[i-1][0] - price[i])
    dp[i][2] = max(dp[i-1][2], dp[i-1][1] + price[i])
    dp[i][2k-1] = max(dp[i-1][2k-1], dp[i-1][2k-2] - price[i])
    dp[i][2k] = max(dp[i-1][2k], dp[i-1][2k-1] + price[i])
  • ③ dp数组如何初始化 :
    dp[0][0] = 0 dp[0][1] = -price[0] dp[0][2] = 0
    dp[0][2k-1] = -price[0] dp[0][2k] = 0

动态规划:309.最佳买卖股票时机含冷冻期

在满足 卖出股票后,你无法在第二天买入股票 的条件下,你可以尽可能地完成更多的交易。
动态规划五步曲:

  • ① 确定dp[i][j]的含义 :
    第i天持有这个股票的最大金额dp[i][0],
    第i个天保持卖出这个股票的最大金额dp[i][1],(买的时候没有冷冻期)
    第i天卖出这个股票的最大金额dp[i][2],
    第i个天冷冻期时这个股票的最大金额dp[i][3];
  • ② 求递推公式 :
    • 持有状态:
      一直持有 / 第 i-1 天保持卖出,第i天买入 / 第 i-1 天冷冻期,第i天买入 三者取最大
      dp[i][0] = max(dp[i-1][0], max(dp[i-1][1]-price[i], dp[i-1][3]-price[i]))
    • 保持卖出:
      第 i-1 天保持卖出 / 第 i-1 天冷冻期 取最大
      dp[i][1] = max(dp[i-1][1], dp[i-1][3])
    • 卖出:
      第 i-1 天持有
      dp[i][2] = dp[i-1][0] + price[i]
    • 冷冻期:
      第 i-1 天卖出
      dp[i][3] = dp[i-1][2]
  • ③ dp数组如何初始化 :
    dp[0][0] = -price[0]
    以下都是非法状态: — 都可以通过递推关系回推:
    dp[0][1] = 0 dp[0][2] = 0 dp[0][1] = 0

动态规划:714.买卖股票的最佳时机含手续费

要使用尽量少的交易次数获得最大利润,因为每次卖出要交手续费
动态规划五步曲:

  • ① 确定dp[i][j]的含义 :
    第i天持有这个股票的最大金额dp[i][0],第i个天不持有这个股票的最大金额dp[i][1];
    第i-1天持有这个股票的最大金额dp[i-1][0],第i-1个天不持有这个股票的最大金额dp[i-1][1]。
  • ② 求递推公式 :
    • 一直持有 / (第i-1必须未持有)第i天买入 取最大
      dp[i][0] = max(dp[i-1][0],dp[i-1][1] - price[i])
    • 一直未持有 / (第i-1必须持有)第i天卖出 取最大 , 其中fee指交易费
      dp[i][1] = max(dp[i-1][1], dp[i-1][0]+price[i] - fee)
  • ③ dp数组如何初始化 : dp[0][0] = -price[0] dp[0][1] = 0

你可能感兴趣的:(动态规划,java,算法)