题目描述:
给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。
在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
解题思路:
该题与 LeetCode 121. 买卖股票的最佳时机 唯一区别就是可以多次买卖,一次买卖的 dp 本质上还是贪心法,找到 当前最低的购入价 与 与当前最低购入价相差最大的售出价(即局部最优解)。这也满足 dp 的基本策略:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列,即局部最优解也是该问题的子问题的解,即数组不变的情况下减少天数,局部解仍正确。
而这题的关键在于 现金流 ,又可以分为两种情况 当天持有股票时的现金 与 当天不持有股票时的现金。假定初始现金为 0. dp 数组可以设为 dp[i][0] 表示第 i 天持有股票的现金,dp[i][1] 表示第 i 天不持有股票的现金。
当天持有股票则可以分为两种状态:当天购入股票 / 当天前一天已持有股票。当天前一天已持有股票,则维持前一天的状态 即 dp[i][0] = dp[i-1][0]。当天购入股票说明前一天未持有股票,当天持有股票的现金 = 前一天未持有股票的现金 - 当天股票售价,即 dp[i][0] = dp[i-1][1] - prices[i].显然两者直接求最大值才能利润最大化,即: