买卖股票

  • 本文所讲解的内容与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. Flask API 如何接入 i18n 实现国际化多语言

    ​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言. 用户请求 API 的多语言化其实有两种 ...

  2. 如何去除字符串中的 "\n" ?80% 的同学错了!

    大家好,我是鱼皮,今天分享一个小知识. 我最近负责的工作是设计一个 SQL 解析引擎.简单来说,就是将一个 SQL 表达式字符串,解析为一颗对象树,从而执行查询等一系列操作. 在最开始,我就遇到了一个 ...

  3. Vue禁止用户复制文案 + 兼容 IE

    vue必须要加载完才可以操作dom,或者在mounted和created时使用this.$nextTick方法,使dom生成后进行相关操作. created() { this.$nextTick(() ...

  4. PHP 程序员为什么依然是外包公司的香饽饽?

    大家好,我是码农先森. PHP 唯一的爽点就是开发起来「哇真快」这刚好和外包公司的需求相契合,在 Web 领域的芒荒年代 PHP 以王者姿态傲视群雄.如果 PHP 敢说第二,就没有哪门子语言敢称第一, ...

  5. 面试题-python 什么是闭包(closure)?

    前言 前面学了装饰器,那么闭包和装饰器有什么区别呢?闭包传递的是变量,而装饰器传递的是函数对象,只是传的参数内容不一样,闭包的概念包含了装饰器,可以说装饰器是闭包的一种,它只是传递函数对象的闭包. 先 ...

  6. 什么是spring.factories,引入未知模块报错如何解决

    对于maven中引入其他外部包加入容器的过程,需要用到spring.factories spring.factories的作用:将自动配置类与对应的配置类集中在一起,方便springboot自动装配, ...

  7. mp实现一个自连接查询

    起因是我设置了一个考核表结构,其中包含指标值,指标当前值,是主副指标等列. 后面我要进行考核的验收的时候,我发现验收要取得的是主当前指标值/主指标值以及副指标当前值/副指标值.如果想要让这两条数据一次 ...

  8. 从.net开发做到云原生运维(四)——.net core的微服务开发

    1. .net 6.0项目模板变更 在.net 5和.net 3.1的时候,asp.net core项目模板里有个Program类和Startup类,在.net 6中引入了一个最小api的项目模板,在 ...

  9. 高校校园网下电脑IP是不是公网IP

    突然想到一个问题,那就是高校校园网中的IP地址是不是公网IP,如果不是公网IP那么就是使用net后的共享IP,还或者是部分人用公网IP然后另一部分人使用net后的共享IP??? =========== ...

  10. java:找不到符号(使用lombok)

    1.背景 启动报错: Error:(76, 34) java: 找不到符号 符号: 方法 getOrderNo() 位置: 类型为XXXXX.request.coupon.SubmitOrderObj ...