首页 > 其他分享 >【code】动态规划-两种状态

【code】动态规划-两种状态

时间:2023-04-06 17:36:01浏览次数:39  
标签:code 持有 股票 现金 所得 prices 动态 规划 dp

买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

  • dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金
  • 递推公式:
    如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来:
    • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0];
    • 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
      dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);

如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来:
- 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
- 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

  • 初始化: 分析递推公式知道,基础都是要从dp[0][0]和dp[0][1]推导出来
    • dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] -= prices[0];
    • dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;
  • 顺序: 从递推公式可以看出dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。

标签:code,持有,股票,现金,所得,prices,动态,规划,dp
From: https://www.cnblogs.com/xiaoyu-jane/p/17293514.html

相关文章

  • 2023.04.06 - vue组件中动态指定监听的值
    业务场景:高拍仪给出的视频信息API回调里会不断返回图像数据。因为有主副摄像图像信息,并且两个图像信息会二选一展示在DOM容器里。所以就是二对一的关系。//主摄像数据letpriPic:string='';//副摄像数据letsubPic:string='';//展示在容器的数据=主摄像数据||副摄像......
  • python中动态导入文件的方法
    1.简介在实际项目中,我们可能需要在执行代码的过程中动态导入包并执行包中的相应内容,通常情况下,我们可能会将所需导入的包及对象以字符串的形式传入,例如test.test.run,下面将介绍如何动态导入。假设存在如下包:其中test.py的内容如下:count=1defrun():print("run")......
  • VSCode插件Project Manager的使用方法
    1.在VSCode扩展里下载插件ProjectManager   2.点击文件,打开文件夹  3.这是你当前在vscode中打开的项目,单机回车就可以保存到项目管理  3.如果同时保存了多个项目管理文件,还可以给他们进行分组。 单击图标后编辑tags内容  4.再点击如下图标即可看......
  • NuGet Response status code does not indicate success: 401 (Unauthorized).
    Retrying'FindPackagesByIdAsyncCore'forsource'https://nexus-cn/repository/nuget-group/FindPackagesById()?id='Moq'&semVerLevel=2.0.0'.Anerroroccurredwhilesendingtherequest.Therequestwasaborted:Therequest......
  • vscode/PyCharm常用快捷键
    vscode1、显示所有指令:ctrl+shift+P2、查找文件:ctrl+P3、文件内搜索:ctrl+shift+F4、Debug:F55、显示/隐藏终端(Terminal):ctrl+`Pycharm1.位置互换:Alt+shift+箭头上下2.变量重构造:shift+F63.格式化代码:ctrl+alt+l4.同时加东西:一直按alt键,鼠标定......
  • 2023.04.06 - 使用mixin动态混入,对vue组件中的数据做兼容经验总结(xp)
    业务场景:在一个高拍仪的硬件设备中,厂家给了两套不同的API,分别支持winXP和winXP以上版本的系统,而这两套API的实现方式截然不同,一套使用的是http通信,一套是使用scoket通信,方法的调用自然也是不同。我需要在同一组件兼容这两套代码。这种需求下很明显,我除了修改组件里的函数方法,......
  • 动态开点线段树&线段树合并学习笔记
    动态开点线段树使用场景\(4\timesn\)开不下。值域需要平移(有负数)。什么时候开点显然,访问的节点不存在时(只会在修改递归时开点)。trick区间里面有负数时,\(mid=(l+R-1)/2\)。防止越界。例如区间\([-1,0]\)。开点上限考虑到update一次最多开\(\logV\)个......
  • codeforces 1793D Moscow Gorillas
    https://codeforces.com/contest/1793/problem/D解题思路依次找出MEX=1..n+1的序列数量就能得解。MEX=n+1只有全序列这一种情况。MEX=1时,找出两个序列中1的位置,较小位置左边的元素构成的子序列,较大位置右边的元素构成的子序列,以及两个位置中间的元素构成的子序列都满......
  • CodeStar2023年春第3周周赛普及奠基组
    T1:字符串加密本题难度简单,根据题目描述模拟即可。代码实现#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;for(char&c:s){if(islower(c))c-=32;elsec+=32;}reverse(s.beg......
  • 使用malloc实现动态动态数组
    静态数组有一个弊端,就是在创建的时候数组的长度就已经确定了,并且不能更改了,并且使用之后如果我们不需要了,还不能销毁。使用malloc函数可以实现动态的创建数组,我们需要多长的数组就创建多长的数组,而且当我们不需要了,可以进行动态的销毁,从而实现了对我们计算机内存的回收利用``#i......