目录
题目描述
这道题与第122题的唯一区别就是每次卖出股票的时候需要另外支付手续费。
第一步,明确并理解dp数组及下标的含义
//dp[i][0]表示从第0天到第i天结束时,处于持有股票的状态的最大利润
//dp[i][1]表示从第0天到第i天结束时,处于不持有股票的状态的最大利润
int n = prices.size();
//dp[i][0]表示从第0天到第i天结束时,处于持有股票的状态的最大利润
//dp[i][1]表示从第0天到第i天结束时,处于不持有股票的状态的最大利润
vector<vector<int>> dp(n);
for(int i = 0;i < n;i++){
dp[i].resize(2);
}
第二步,分析明确并理解递推公式
1.求dp[i][0]
//第i天结束时处于持有股票的状态,有两种可能的原因:
//一是前一天(第i-1天)结束时就已经处于持有股票的状态(对应dp[i-1][0]),第i天什么也不做
//二是第i天买入了股票(需支付prices[i]),第i天能买入股票的前提是第i-1天结束时处于不持有股票的状态(对应dp[i-1][1])
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
2.求dp[i][1]
//第i天结束时处于不持有股票的状态,有两种可能的原因:
//一是前一天(第i-1天)结束时就已经处于不持有股票的状态(对应dp[i-1][1]),第i天什么也不做
//二是第i天卖出了股票(收入prices[i]-fee),第i天能卖出股票的前提是前一天结束时处于持有股票的状态(对应dp[i-1][0])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
//第i天结束时处于持有股票的状态,有两种可能的原因:
//一是前一天(第i-1天)结束时就已经处于持有股票的状态(对应dp[i-1][0]),第i天什么也不做
//二是第i天买入了股票(需支付prices[i]),第i天能买入股票的前提是第i-1天结束时处于不持有股票的状态(对应dp[i-1][1])
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
//第i天结束时处于不持有股票的状态,有两种可能的原因:
//一是前一天(第i-1天)结束时就已经处于不持有股票的状态(对应dp[i-1][1]),第i天什么也不做
//二是第i天卖出了股票(收入prices[i]-fee),第i天能卖出股票的前提是前一天结束时处于持有股票的状态(对应dp[i-1][0])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
第三步,理解dp数组如何初始化
dp[0][0] = -prices[0];//第0天结束时处于持有股票的状态,只能是因为买入了当天的股票,需支付prices[0],利润是负prices[0]
dp[0][1] = 0;//第0天结束时处于不持有股票的状态,那就是没有交易或者买入了又卖出了,利润是0
第四步,理解遍历顺序
dp[i]依赖于dp[i-1],因此i应该从小到大遍历。
代码
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
//dp[i][0]表示从第0天到第i天结束时,处于持有股票的状态的最大利润
//dp[i][1]表示从第0天到第i天结束时,处于不持有股票的状态的最大利润
vector<vector<int>> dp(n);
for(int i = 0;i < n;i++){
dp[i].resize(2);
}
dp[0][0] = -prices[0];//第0天结束时处于持有股票的状态,只能是因为买入了当天的股票,需支付prices[0],利润是负prices[0]
dp[0][1] = 0;//第0天结束时处于不持有股票的状态,那就是没有交易或者买入了又卖出了,利润是0
for(int i = 1;i < n;i++){
//第i天结束时处于持有股票的状态,有两种可能的原因:
//一是前一天(第i-1天)结束时就已经处于持有股票的状态(对应dp[i-1][0]),第i天什么也不做
//二是第i天买入了股票(需支付prices[i]),第i天能买入股票的前提是第i-1天结束时处于不持有股票的状态(对应dp[i-1][1])
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
//第i天结束时处于不持有股票的状态,有两种可能的原因:
//一是前一天(第i-1天)结束时就已经处于不持有股票的状态(对应dp[i-1][1]),第i天什么也不做
//二是第i天卖出了股票(收入prices[i]-fee),第i天能卖出股票的前提是前一天结束时处于持有股票的状态(对应dp[i-1][0])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
}
return dp[n-1][1];
}
};