买卖股票系列是动态规划算法的一种重要系列,可能有些题用其他算法更简便,但是动态规划算法在整个系列中具有很好的连贯性,属于是能举一反三的那种。
思路分析:
- 使用一个二维数组
dp
来记录每一天结束时持有或不持有股票的最大利润。 - 初始化第一天的状态,即第一天持有股票的最大利润为负的股票价格,第一天不持有股票的最大利润为0。
- 从第二天开始遍历股票价格数组,根据动态规划的思想,更新每一天结束时的最大利润。
- 最后返回最后一天不持有股票的最大利润,即为整个交易周期的最大利润。
class Solution {
public:
// 函数用于计算最大利润
int maxProfit(vector<int>& prices) {
// 使用动态规划,创建一个二维数组dp
// dp[i][j]表示第i天结束时的最大利润,其中j=0表示持有股票,j=1表示不持有股票
vector<vector<int>> dp(prices.size()+1, vector<int>(2, 0));
// 初始化第一天的状态
dp[0][0] = 0 - prices[0]; // 第一天持有股票,所以利润为负的股票价格
dp[0][1] = 0; // 第一天不持有股票,利润为0
// 从第二天开始遍历股票价格数组
for(int i = 1; i < prices.size(); i++) {
// 计算第i天持有股票的最大利润
dp[i][0] = max(dp[i-1][0], 0 - prices[i]);
// 计算第i天不持有股票的最大利润
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
// 返回最后一天不持有股票的最大利润,即为整个交易周期的最大利润
return dp[prices.size()-1][1];
}
};