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;
}