121. 买卖股票的最佳时机
文档讲解:代码随想录. 买卖股票的最佳时机
视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1
状态:已完成
代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 第四种方法,动态规划
int len = prices.size();
if (len == 0)
return 0;
// 1.构建dp数组
vector<vector<int>> dp(len, vector<int>(2));
// 2.初始化
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < len; i++) {
dp[i][0] = max(dp[i - 1][0], -prices[i]);
dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
cout << "the dp "<< i <<", 0 is " << dp[i][0] << ", 1 is" << dp[i][1]
<< endl;
}
return dp[len - 1][1];
}
};
心得体会
- 通过两次的取最大值判断,还是有些绕,但是通过打印dp数组,还是能理解一些的。
122.买卖股票的最佳时机II
文档讲解:代码随想录. 买卖股票的最佳时机II
视频讲解:动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II
状态:已完成
代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>>dp(len ,vector<int>(2,0));
dp[0][0]=-prices[0];
dp[0][1]= 0;
for(int i = 1; i <len;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[len-1][1];
}
};
心得体会
1.dp公式推导
第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
123.买卖股票的最佳时机III
文档讲解:代码随想录. 买卖股票的最佳时机III
视频讲解:动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III
状态:已完成
代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(5, 0));
dp[0][1] = -prices[0];
dp[0][3] = -prices[0];
for (int i = 1; i < prices.size(); i++) {
dp[i][0] = dp[i - 1][0];
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
}
return dp[prices.size() - 1][4];
}
};
心得体会
1.似懂非懂,后面再看吧