买卖股票的最好时机(二)

描述

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票

2. 如果不能获取收益,请返回0

3. 假设买入卖出均无手续费

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

输入描述:

第一行输入一个正整数 n ,表示数组 prices 的长度

第二行输入 n 个正整数,表示数组中prices的值

输出描述:

输出最大收益

示例1

输入:

7
8 9 2 5 4 7 1

复制输出:

7

复制说明:

在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1
在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3
在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3
总获利1+3+3=7,返回7     

示例2

输入:

5
5 4 3 2 1

复制输出:

0

复制说明:

由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。          

示例3

输入:

5
1 2 3 4 5

复制输出:

4

复制说明:

第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。      
#include<stdio.h>
#include<algorithm>
using namespace std;
int prices[100005];
int dp[100005][3];
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&prices[i]);}int ans=0;int pre=prices[1];for(int i=2;i<=n;i++){int current=prices[i];if(current>pre){ans+=current-pre;}pre=current;}printf("%d\n",ans);return 0;
}

DP32 买卖股票的最好时机(三)

描述

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1. 你最多可以对该股票有两笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
2. 如果不能获取收益,请返回0
3. 假设买入卖出均无手续费

要求: 空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

输入描述:

第一行输入一个正整数 n ,表示数组 prices 的长度

第一行输入 n 个正整数,表示数组 prices 的所有元素的值

输出描述:

输出最大收益

示例1

输入:

6
8 9 3 5 1 3

复制输出:

4

复制说明:

第三天(股票价格=3)买进,第四天(股票价格=5)卖出,收益为2
第五天(股票价格=1)买进,第六天(股票价格=3)卖出,收益为2
总收益为4。             

示例2

输入:

4
9 8 4 1

复制输出:

0

复制

示例3

输入:

5
1 2 8 3 8

复制输出:

12

复制说明:

第一笔股票交易在第一天买进,第三天卖出;第二笔股票交易在第四天买进,第五天卖出;总收益为12。
因最多只可以同时持有一只股票,所以不能在第一天进行第一笔股票交易的买进操作,又在第二天进行第二笔股票交易的买进操作(此时第一笔股票交易还没卖出),最后两笔股票交易同时在第三天卖出,也即以上操作不满足题目要求。    
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int prices[100005];
int dp[100005][5];
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&prices[i]);}//dp[i][0]表示到第i天为止没有买卖过股票的最大收益//dp[i][1]表示到第i天为止买过一次股票还没有卖出的最大收益//dp[i][2]表示到第i为止买卖过一次股票的最大收益//dp[i][3]表示到第i天为止买了两次卖出一只的最大收益//dp[i][4]表示到第i天为止买卖了两次股票的最大收益for(int i=0;i<=4;i++){dp[1][i]=-1e9;}dp[1][0]=0;dp[1][1]=-prices[1];for(int i=2;i<=n;i++){dp[i][0]=dp[i-1][0];dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i]);dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i]);dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i]);}int ans=max(dp[n][0],max(dp[n][2],dp[n][4]));printf("%d\n",ans);return 0;}

 DP33 买卖股票的最好时机(四)

描述

假设你有一个数组pricesprices,长度为nn,其中prices[i]prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1. 你最多可以对该股票有kk笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
2. 如果不能获取收益,请返回0
3. 假设买入卖出均无手续费

输入描述:

第一行输入一个正整数 n 和一个正整数 k。表示数组 prices 的长度和 交易笔数

第二行输入 n 个正整数表示数组的所有元素值。

输出描述:

输出最大收益

示例1

输入:

6 3
8 9 3 5 1 3

复制输出:

5

复制说明:

第一天(股票价格=8)买进,

第二天(股票价格=9)卖出,收益为1

第三天(股票价格=3)买进,

第四天(股票价格=5)卖出,收益为2

第五天(股票价格=1)买进,

第六天(股票价格=3)卖出,收益为2

总收益为5。

示例2

输入:

8 2
3 2 5 0 0 3 1 4

复制输出:

7

复制说明:

第二天(股票价格=2)买进,

第三天(股票价格=5)卖出,收益为3

第五天(股票价格=0)买进,

第八天(股票价格=4)卖出,收益为4

总收益为7

示例3

输入:

4 4
9 8 4 1

复制输出:

0

复制

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int dp[1005][205];
int prices[1005];
int main()
{int n;int k;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&prices[i]);}int s=2*k;for(int i=0;i<=s;i++){dp[1][i]=-1e9;}dp[1][0]=0;dp[1][1]=-prices[1];for(int i=2;i<=n;i++){for(int j=0;j<=s;j++){if(j==0){dp[i][j]=dp[i-1][j];}else if(j%2==1){dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);}else{dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);}}}int ans=0;for(int i=0;i<=s;i=i+2){ans=max(ans,dp[n][i]);}printf("%d\n",ans);return 0;
}

DP31 买卖股票的最好时机(二)、(三)、(四)相关推荐

  1. 买卖股票的最好时机二Python解法

    给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参 ...

  2. dp(八)买卖股票的最好时机 (一,二、三)

    目录 买卖股票的最好时机(一)_牛客题霸_牛客网 买卖股票的最好时机(二)_牛客题霸_牛客网 买卖股票的最好时机(三)_牛客题霸_牛客网 假设你有一个数组prices,长度为n,其中prices[i] ...

  3. 买卖股票的最好时机(一、二)

    目录 买卖股票的最好时机(一) 动态规划解决 贪心思想解决 买卖股票的最好时机(二) 贪心思想解决 动态规划解决 买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最令我煎熬的就是状态方程递推, ...

  4. 30、买卖股票的最好时机

    买卖股票的最好时机(一) 描述 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股 ...

  5. 牛客题霸 [买卖股票的最好时机] C++题解/答案

    买卖股票的最好时机 题解: 设两个变量,一个为minn,一个为maxx 当遇到比当前minn还小的价钱时,就更新minn 当与minn大时,就计算如果这个价卖出,赚多少钱,maxx不断更新取最大值 这 ...

  6. JZ63 买卖股票的最好时机(一)

    描述 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖 ...

  7. 剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格, ...

  8. 动态规划——买卖股票的最好时机(Leetcode 121)

    题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...

  9. 【力扣刷题】121.买卖股票的最好时机(python)

    题目简述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计 ...

最新文章

  1. MongoDB整理笔记の管理Replica Sets
  2. 基于STC8H1K28的双轴机械臂驱动模块:步进电机42HS348E,BH32角度传感器
  3. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
  4. iops 条带深度 队列深度 NCQ
  5. 精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由
  6. anaconda moviepy_Anaconda的安装和Jupyter Notebook使用
  7. 7-7自动色阶/自动对比度/自动颜色
  8. Excel关于超级链接的宏命令
  9. 【特征提取】基于matlab倒谱距离端点检测【含Matlab源码 1767期】
  10. 不要VIP,想看啥就看啥的在线网站!
  11. 10分钟学会数据地图制作,让你的可视化再高一级!
  12. python写监控脚本_python写个进程监控的脚本
  13. RPC框架的使用场景
  14. Windows10桌面优化 | 如何修改图标大小 | 如何把win10快捷方式小箭头去掉
  15. MFC/VC++中怎样将一个位图添加到数据库中并且将其读出来到指定的Picture控件上
  16. oracle 10g ora12560,OracleORA-12560解决方法
  17. 万字干货:大道至简,用户增长模型体系/完整方法论/实操经验分享
  18. 网络学习(第十六篇-ICMP协议)
  19. AI人工智能识别技术如何助力构建风险监测预警系统?
  20. 如何通过ABB代理程序备份群晖DSM系统

热门文章

  1. 修改图片拓展名,转换图片格式
  2. 虚拟环境命令+linux基本操作(各种版本查看+进程操作+目录+文件)
  3. local_umask=022是什么意思?
  4. speedoffice怎么在word里设置上下标?
  5. 1196: 7210 计算指数
  6. pthread_cond_wait详解
  7. 黑马传智播客第三十六期前端最新学习视频分享
  8. “ Linux 和 Kubernetes 正在成为一切的平台”—— 对话全球最大独立开源公司 SUSE CTO...
  9. 大数据毕设系列项目说明 【源码+论文】
  10. 盘古开源解析:大数据时代,如何守护数据的信息安全?