1.买卖股票的最佳时机
视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili
代码随想录
代码:
class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(2,0));// dp[i][0]表示当天持有股票的最大收入// dp[i][1]表示当天不持有股票的最大收入dp[0][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][0] + prices[i],dp[i - 1][1]);}return dp[prices.size() - 1][1];}
};
思路:
dp数组的含义:dp[i][0]表示当天持有股票的最大收入;dp[i][1]表示当天不持有股票的最大收入
dp数组的递推: 持有股票:前一天就已经买入了股票 或 当天买入股票,即dp[i][0] = max(dp[i - 1][0],-prices[i]);不持有股票:前一天就卖出了股票 或 在持有股票的前提下,当天卖出股票,即 dp[i][1] = max(dp[i - 1][0] + prices[i],dp[i - 1][1]);
dp数组的初始化:第0天,就持有股票,只能是当天买入了股票dp[0][0] = -prices[0];第0天就不持有股票,且题上说只能在不同的天数卖出,所以只能是没有买入股票的状态 dp[0][1] = 0
dp数组的遍历顺序:后一天的dp元素值依赖于前一天的值,所以正序遍历即可。
2.买卖股票的最佳时机2
视频讲解:动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II_哔哩哔哩_bilibili
代码随想录
代码:
class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(2,0));// dp[i][0]表示当天持有股票的最大利润// dp[i][1]表示当天不持有股票的最大利润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],dp[i - 1][1] - prices[i]);// 当天不持有股票可能是前一天就不持有股票 或 前一天持有股票的前提下当天卖出股票dp[i][1] = max(dp[i - 1][1],dp[i - 1][0] + prices[i]);}return dp[prices.size() - 1][1];}
};
思路:
和上一题基本一样,不同的就是我们这次可以多次买卖股票。具体在代码上的不同就是——在持有股票的当天买入的表达式中,我们从-prices[i] 变为了 dp[i-1][1] - prices[i]。我们在前一天不持有股票的基础上买入,而不是在没有买卖任何股票的情况下(也就是0)买入。
dp数组的含义:dp[i][0]表示当天持有股票的最大收入;dp[i][1]表示当天不持有股票的最大收入
dp数组的递推: 当天持有股票:可能是前一天就持有股票 或 前一天不持有股票的前提下当天买入股票,即dp[i][0] = max(dp[i - 1][0],dp[i - 1][1] - prices[i];当天不持有股票:可能是前一天就不持有股票 或 前一天持有股票的前提下当天卖出股票,即dp[i][1] = max(dp[i - 1][1],dp[i - 1][0] + prices[i]);
dp数组的初始化:第0天不持有股票,只能是压根就没买股票或者是当天买入又卖出了,都是dp[0][1] = 0;第0天持有股票,只能是dp[0][0] = -prices[0]
dp数组的遍历顺序:后一天的dp值依赖于前一天的值,正序遍历