一、题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
二、动态规划解题思路总结
- 明确
dp[i]的含义 - 找到
dp[i]与dp[i-1]的关系,也就是状态转移方程 - 计算初始值
dp[0]
三、题解
3.1 思路分析
求的是计算你所能获取的最大利润,那么我们首先需要明确dp[i]的含义,这里的dp[i]可以是第i天获得的最大利润,我们的目标就是在所有的dp[i]中找到最大的dp[i];
找到dp[i]与dp[i-1]的关系,dp[i-1]就是第i-1天获得的最大利润,第i天获得的利润应该是第i天的价格减去第i天之前的最小价格。第i天获得的最大利润应该是第i-1天获得的最大利润与第i天获得的利润中的较大的那一个,也就是dp[i]应该等于dp[i-1]和price[i]- minprice中的最大值;
所以我们还要维护一下minprice,其中i = 0时,minprice = price[0],i = 1时,minprice = min{minprice,price[1-1]},以此类推,minprice = min{minprice,price[i-1]};
计算初始值:很显然第一天获得的最大利润是0,即 dp[0] = 0。
3.2 思路总结
| 相关含义 | |
|---|---|
dp[i] | 第i天获得的最大利润 |
dp[i-1] | 第i-1天获得的最大利润 |
minprice | 第i天之前的最小价格 |
price[i] | 第i天的价格 |
| 动态规划思路 | |
|---|---|
明确dp[i]的含义 | 是第i天获得的最大利润 |
找到dp[i]与dp[i-1]的关系 | dp[i] = max{dp[i-1], price[i]- minprice} |
| 计算初始值 | dp[0] = 0 |
3.3 代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
int dp[n];
dp[0] = 0;
int minprice = prices[0];
for(int i = 1; i < n; i++)
{
minprice = min(minprice, prices[i-1]);
dp[i] = max(dp[i-1], prices[i] - minprice);
}
return dp[n-1];
}
};
四、进度及知识点总结
| 题目 | 知识点 | 进度 |
|---|---|---|
| 136 | 数组、位运算(异或)、哈希表 | 1 |
| 121 | 数组、动态规划 | 2 |
万事开头难,前期选一个些比较简单的题目,热热身,比较容易进入状态,快来跟我一起来记录这个从 0 到 N 的过程吧,享受愉快的刷题过程吧~