本文最后更新于596 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q
1.本题题意给出股票共买卖一次,所以厘清题意特别重要,本题的dp数组的定义也特别有讲究,定义了一个二维数组dp[i][0]表示第i天持有股票的最大利润dp[i][1]表示第i天不持有股票的最大利润。很巧妙的包含了全部的状态,动态规划最重要的莫过于状态的转移了,由于只买卖一次所以当说到递归公式上,持有股票可以是前一天就持有了即dp[i - 1][0]又可以是前一天没有持有今天持有的直接减当天的价钱即可即-prices[i]所以审题很重要。
CPP
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i = 1; i <prices.size(); i++){
dp[i][0] = max(dp[i - 1][0], -prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]);
}
};