leetcode-714 买卖股票的最佳时机含手续费

leetcode-714 买卖股票的最佳时机含手续费

1. 题目

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。

2. 思路

这是一道动态规划题目,每天只有两个状态,持有股票,或者不持有股票,因此设计两个数组,dp1和dp2,dp1代表持有股票时的最大利润,dp2代表不持有股票的最大利润,在第i天结束时,假设是持有股票的,则,这一天的利润为max(第一种情况:{前一天持股,今天继续保持},第二种情况:{前一天不持股,购入今天的股票}),则状态转移方程为

dp1[i]=max(dp1[i-1],dp2[i-1]-prices[i])

假设在第i天结束时不持有股票,则这一天的利润为max(第一种情况:{前一天不持股,今天不购入},第二种情况:{前一天持股,今天卖出}),且卖出时收入费用fee,买入时不收取,状态转移方程为

dp2[i]=max(dp2[i-1],dp1[i-1]+prices[i]-fee)

3. code

#include <iostream>
#include <vector>
using namespace std;

class Solution {
 public:
  int maxProfit(vector<int>& prices, int fee) {
    int dp1[50000] = {0};  //持股
    int dp2[50000] = {0};  //不持股
    dp1[0] = -prices[0];
    int len = prices.size();
    for (int i = 1; i < len; i++) {
      dp1[i] = dp1[i - 1] > (dp2[i - 1] - prices[i]) ? dp1[i - 1]
                                                     : (dp2[i - 1] - prices[i]);
      dp2[i] = dp2[i - 1] > (dp1[i - 1] + prices[i] - fee)
                   ? dp2[i - 1]
                   : (dp1[i - 1] + prices[i] - fee);
      //dp1[i-1] + prices[i] - fee
    }
    return dp1[len - 1];
  }
};

int main() {
  vector<int> x = {1, 3, 2, 8, 4, 9};
  Solution s;
  s.maxProfit(x, 2);
  return 0;
}
posted @ 2021-10-16 10:45  流光之中  阅读(98)  评论(0编辑  收藏  举报