线性dp:LeetCode122.买卖股票的最佳时机ll
买卖股票
- 本文所讲解的内容与LeetCode122. 买卖股票的最佳时机ll,这道题题意相同,阅读完本文后可以自行挑战一下
- 力扣链接
题目叙述:
给定一个长度为N的数组,数组中的第i个数字表示一个给定股票在第i天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉悠前的股票)。一次买入卖出合为一笔交易。
输入格式:
第一行包含整数 N,表示天数。第二行包含N个不大于10000的正整数表示每天股票的价格。
输出格式
输出一个整数,表示最大利润。
输入样例1
6
7 1 5 3 4 6
输出样例1
7
输入样例2
5
7 6 4 3 1
输出样例2
0
样例解释:
- 样例1:在第2天买入,在第3天卖出,这笔交易所能获得利润=5-1=4。随后在第4天买入,在第6天卖出,这笔交易所能获得利润=6-3=3。共得利润4+3 =7
- 样例2:在这种情况下,不进行任何交易,所以最大利润为 0。
动态规划思路讲解:
- 我们分析总利润可知,总利润是关于天数
i的函数,并且在第i天的时候,只有两种状态与之对应- 1.手中无票:
dp[i][0] - 2.手中有票:
dp[i][1]
- 1.手中无票:
- 所以说我们可以设置
dp[i][0],dp[i][1]为状态变量,然后进行状态的转移,最终得出我们需要的答案。
1.状态变量的含义
dp[i][0]表示第i天,手中无票时能够获取的最大利润dp[i][1]表示第i天,手中有票时能够获取的最大利润
2. 递推公式
我们可以使用带权的有向图来生动的理解这个过程,我们要知道递推公式,就要了解状态转移的那个过程,也就是我们当前的状态是由以前的哪些状态推导而来。
dp[i][0]表示第i天,手中无票时能获取的最大利润,我们可以通过dp[i-1][0]和dp[i-1][1],也就是第i-1天,手中有票或者手中无票这两个状态推导而来,如果是第i-1天手中无票,那么表示没有发生交易,那么dp[i][0]=dp[i-1][0],反之,从i-1天有票到第i天无票,那么意味着我们在第i天卖掉了股票,此时dp[i][0]=dp[i-1][1]+w[i],由于我们是取最大利润,所以说是取二者的最大值,即:
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+w[i]);
dp[i][1]也是同理,跟上面的推导方式差不多,所以我就不在赘述了
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-w[i]);
所以说,总的递推公式如下:
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+w[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-w[i]);
3.如何初始化?
- 我们由这个递推公式,如何初始化边界条件呢?
- 假设我们从第1天开始,到第n天结束,那么我们第一天的两个状态就是边界条件
dp[1][0]=0; //第1天无票的最大利润就是0
dp[1][1]=-w[1]; //第1天就有票证明我买了第一天的那个股票
4. 遍历顺序
- 由递推公式可知,我们的状态变量
dp[i][0],dp[i][1]取决于dp[i-1][0],dp[i-1][1]。所以说我们的遍历顺序是从前到后进行遍历。
5. 举例打印dp数组
- 在本题,读者可以自行在for循环内进行插入printf语句进行验证我们dp数组的正确性
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100010;
int w[N],dp[N][2];
int n;
int main(){
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
dp[1][0]=0; dp[1][1]=-w[1];
for(int i=2; i<=n; ++i){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+w[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-w[i]);
}
//第n天的时候,手中无票一定是利润最大,所以说不用取二者最大值了。
cout<<dp[n][0];
}
LeetCode122的参考代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int> > dp(prices.size(),vector<int>(2));
//进行初始化条件
dp[0][0] = 0;
dp[0][1] = -prices[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][0];
}
};
线性dp:LeetCode122.买卖股票的最佳时机ll的更多相关文章
- [Swift]LeetCode122. 买卖股票的最佳时机 II | Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- LeetCode122.买卖股票的最佳时机II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- leetcode122 买卖股票的最佳时机 python
题目:给定一个数组,它表示了一只股票的价格浮动,第i个元素代表的是股票第i天的价格.设计一个函数,计算出该股票的最大收益,注意,可以多次买入卖出,但下一次买入必须是在本次持有股票卖出之后.比如[1,7 ...
- Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)
Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock) 股票问题: 121. 买卖股票的最佳时机 122. 买卖股票的最 ...
- Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) 股票问题: 121. 买卖股票的最佳时机 122. ...
- Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III) 股票问题: 121. 买卖股票的最佳时机 122 ...
- Leetcode之动态规划(DP)专题-188. 买卖股票的最佳时机 IV(Best Time to Buy and Sell Stock IV)
Leetcode之动态规划(DP)专题-188. 买卖股票的最佳时机 IV(Best Time to Buy and Sell Stock IV) 股票问题: 121. 买卖股票的最佳时机 122. ...
- Leetcode之动态规划(DP)专题-714. 买卖股票的最佳时机含手续费(Best Time to Buy and Sell Stock with Transaction Fee)
Leetcode之动态规划(DP)专题-714. 买卖股票的最佳时机含手续费(Best Time to Buy and Sell Stock with Transaction Fee) 股票问题: 1 ...
- LeetCode《买卖股票的最佳时机》系列题目,最详解
目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...
- lintcode:买卖股票的最佳时机 III
买卖股票的最佳时机 III 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易. 样例 给出一个样例数组 [4,4,6,1,1,4,2 ...
随机推荐
- 全新发布!桌面端效率工具RunFlow
RunFlow是一款跨平台的生产力工具,可以启动应用程序和搜索文件等,类似于Windows平台的Wox和PowerToys,同样也类似于Mac平台的Alfred和Raycast.但我们并不与这些工具相 ...
- 1. C++ 开发环境
C++ 开发环境 Visual C++ / GCC(G++) / Clang(Clang++) 集成开发环境:Visual Studio / CodeLite / Code::blocks / CLi ...
- 图扑低代码数字孪生 Web SCADA 智慧钢厂
2024 年 4 月,中国钢铁工业协会发布了<钢铁行业数字化转型评估报告(2023年)>(以下简称<报告>).<报告>指出,绝大部分钢铁企业建立了数字化转型相关管理 ...
- .NET单元测试使用AutoFixture按需填充属性的几种方式,以及最佳实践
AutoFixture是一个.NET库,旨在简化单元测试中的数据设置过程.通过自动生成测试数据,它帮助开发者减少测试代码的编写量,使得单元测试更加简洁.易读和易维护.AutoFixture可以用于任何 ...
- ComfyUI进阶:Comfyroll插件 (六)
ComfyUI进阶:Comfyroll插件 (六) 前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业 ...
- 使用win server 2019服务器的iis服务发布静态网页
1.首先远程连接到服务器 2.打开服务器管理器 3添加角色和功能 4.安装类型:选择基于角色或基于功能的安装 →服务器角色:从服务器池中选择服务器 5.服务器角色选择Web服务器(iis) 6.功能 ...
- DuiLib的编译
Duilib编译需要注意两点: 加入预处理器:WIN32;_DEBUG;_WINDOWS;UILIB_STATIC; 到这一步还是报错,报错的是DuiString += 这一行报错,还有Util这 ...
- 【SpringMVC】06 转发 & 重定向
除了快速入门的视图解析器方式处理, 我们还可以使用原生的Servlet转发方式执行 访问测试 还有重定向 访问 测试 使用SpringMVC的转发&重定向 和原生的重定向,有一点不同,MVC的 ...
- 特朗普开始在YouTube上打竞选广告了 —— 美国总统的竞选广告已经开始媒体投放了
相关: 拜登开始在YouTube上打竞选广告了 -- 美国总统的竞选广告已经开始媒体投放了 PS. 又多了一个猴上台,哈哈哈. 特朗普的竞选资金筹集网站:
- 关于python的GIL的解除——PEP 703 – Making the Global Interpreter Lock Optional in CPython
PEP地址: https://peps.python.org/pep-0703/ PEP 703 – Making the Global Interpreter Lock Optional in CP ...