买卖股票

  • 本文所讲解的内容与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]
  • 所以说我们可以设置dp[i][0],dp[i][1] 为状态变量,然后进行状态的转移,最终得出我们需要的答案。

1.状态变量的含义

  • dp[i][0]表示第i天,手中无票时能够获取的最大利润
  • dp[i][1]表示第i天,手中有票时能够获取的最大利润

2. 递推公式

  • 我们可以使用带权的有向图来生动的理解这个过程,我们要知道递推公式,就要了解状态转移的那个过程,也就是我们当前的状态是由以前的哪些状态推导而来。

      1. 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]);
      1. 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的更多相关文章

  1. [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 ...

  2. LeetCode122.买卖股票的最佳时机II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  3. leetcode122 买卖股票的最佳时机 python

    题目:给定一个数组,它表示了一只股票的价格浮动,第i个元素代表的是股票第i天的价格.设计一个函数,计算出该股票的最大收益,注意,可以多次买入卖出,但下一次买入必须是在本次持有股票卖出之后.比如[1,7 ...

  4. Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock) 股票问题: 121. 买卖股票的最佳时机 122. 买卖股票的最 ...

  5. 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. ...

  6. 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 ...

  7. 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. ...

  8. 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 ...

  9. LeetCode《买卖股票的最佳时机》系列题目,最详解

    目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...

  10. lintcode:买卖股票的最佳时机 III

    买卖股票的最佳时机 III 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易. 样例 给出一个样例数组 [4,4,6,1,1,4,2 ...

随机推荐

  1. yb课堂之单机和分布式应用的登陆校验解决方案 《七》

    单机tomcat应用登陆校验 session保存在浏览器和应用服务器会话之间 用户登陆成功,服务端会保存一个session,当然客户端有一个sessionId 客户端会把sessionId保存在coo ...

  2. sheetjs导出表格时间错误问题

    最近使用sheetjs,前端web去导出生成excel,xlsx表格.其中遇到一种问题,那就是时间出错了!比如多出8小时43秒,少了43秒.看到这种问题的时候,我也一脸懵逼.先上图! 不过在有些人电脑 ...

  3. C# 轻量级 ORM 框架 NPoco 的简单应用

    目录 简介 快速入门 安装 NuGet 包 实体类User 数据库类DbFactory 增删改查 Insert Select Update Delete 总结 简介 NPoco 是 PetaPoco ...

  4. Apache Hudi X Apache Kyuubi,中国移动云湖仓一体的探索与实践

    分享嘉宾:孙方彬 中国移动云能力中心 软件开发工程师 编辑整理:Hoh Xil 出品平台:DataFunTalk 导读:在云原生 + 大数据的时代,随着业务数据量的爆炸式增长以及对高时效性的要求,云原 ...

  5. CentOS 8安装docker

    1.查看Linux内核(Docker最低支持CentOS 7 64位 内核3.10) uname -a 2.安装docker(输入yes,然后等待-) yum install docker 3.启动d ...

  6. oeasy 教您玩转linux 010303文件管理器 nautilus

    我们来回顾一下 上一部分我们都讲了什么? 讲了火狐 火狐的位置 用命令行打开多个网址 火狐的升级 火狐桌面建立快捷方式 我们可以知道桌面快捷方式文件的名称么? 从文件管理器到命令行 按住文件 拖动到t ...

  7. oeasy教您玩转vim - 44 - # 综合练习

    ​ 综合练习 回忆上节课内容 上次我们学到了各种的替换模式 r,替换当前光标的字符 R,进入替换模式 ~,改变大小写 这次来个综合练习吧! 我们这次要完成这样一个任务 我们有的时候需要写日志 Syst ...

  8. 关于导入react native项目导致运行异常的那些事

    从git上导入公司的项目,在本地运行的时候,项目无法运行.sdk,jdk,node都是使用公司规定的版本,项目中的local.properties文件sdk.dir路径也换成了自己本地的目录,结果就在 ...

  9. Java 线程池之Jetty 线程池学习总结

    Java 线程池之Jetty 线程池学习总结 前提 Jetty 11.0.x 为什么是Jetty? Java提供4中创建线程池的快捷方式 Executors.newFixedThreadPool(); ...

  10. Sysbench 使用总结

    Sysbench使用总结 实践环境 CentOS 7.8 Sysbench 1.0.20 下载地址:https://github.com/akopytov/sysbench/archive/refs/ ...