题目 leetcode 714.买卖股票的最佳时机含手续费
思路
动态规划
首先确定状态转移方程:
定义
dp[i][0] :第i天手中没有股票的情况下的最大利润
dp[i][1] : 第i天手中有股票的情况下的最大利润
原因
在第i天,两种情况:
(1)第i天交易完,手中无股票,分两种情况讨论
i) 第i-1天时,手中就已经没有股票。此时的利润为昨天没有股票时的最大利润。
ii) 第I-1天时,手中还有股票,但在第i天卖掉了股票。此时的利润为昨天有股票的最大利润+今日股票卖出价格
dp[i][0]为第i天手中没有股票的情况下的最大利润,即dp[i][0]=max( i),ii))
(2)现在手中有股票:分两种情况讨论
i) 第i-1天时,手中就有股票。此时的利润为昨天有股票的最大利润。
ii) 第I-1天时,手中没有股票,但在i天买了股票。此时的利润为昨天没有股票的最大利润-今日股票买入价格-手续费
dp[i][0]为第i天手中有股票的情况下的最大利润,即dp[i][1]=max( i),ii))
方程
dp[i][0] = max(dp[i-1][0], dp[i-1][1]+price[I]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-price[I]-fee);
注意:每笔交易只需要为支付一次手续费,在这里我将手续费的支出放在买入时。
初始化
dp[0][0] = 0;
dp[0][1] = -price[0]-fee;
返回值
返回值,即最后结果,也就是获得利润的最大值
在dp[n-1][0]和dp[n-1][1]中选,由于手中无股票时的利润值一定大于手中有股票时的利润值,所以res = dp[n-1][0];
AC代码
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
//状态方程初始化
int dp[n][2];
dp[0][0] = 0;
dp[0][1] = -prices[0]-fee;
for(int i = 1; i < n; i++) {
//第i天手中无股票时的最大利润
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
//第i天手中有股票时的最大利润
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i] - fee);
}
return dp[n-1][0];
}
};