DP31 买卖股票的最好时机(二)、(三)、(四)
买卖股票的最好时机(二)
描述
假设你有一个数组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 买卖股票的最好时机(二)、(三)、(四)相关推荐
- 买卖股票的最好时机二Python解法
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参 ...
- dp(八)买卖股票的最好时机 (一,二、三)
目录 买卖股票的最好时机(一)_牛客题霸_牛客网 买卖股票的最好时机(二)_牛客题霸_牛客网 买卖股票的最好时机(三)_牛客题霸_牛客网 假设你有一个数组prices,长度为n,其中prices[i] ...
- 买卖股票的最好时机(一、二)
目录 买卖股票的最好时机(一) 动态规划解决 贪心思想解决 买卖股票的最好时机(二) 贪心思想解决 动态规划解决 买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最令我煎熬的就是状态方程递推, ...
- 30、买卖股票的最好时机
买卖股票的最好时机(一) 描述 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股 ...
- 牛客题霸 [买卖股票的最好时机] C++题解/答案
买卖股票的最好时机 题解: 设两个变量,一个为minn,一个为maxx 当遇到比当前minn还小的价钱时,就更新minn 当与minn大时,就计算如果这个价卖出,赚多少钱,maxx不断更新取最大值 这 ...
- JZ63 买卖股票的最好时机(一)
描述 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖 ...
- 剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格, ...
- 动态规划——买卖股票的最好时机(Leetcode 121)
题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...
- 【力扣刷题】121.买卖股票的最好时机(python)
题目简述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计 ...
最新文章
- MongoDB整理笔记の管理Replica Sets
- 基于STC8H1K28的双轴机械臂驱动模块:步进电机42HS348E,BH32角度传感器
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
- iops 条带深度 队列深度 NCQ
- 精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由
- anaconda moviepy_Anaconda的安装和Jupyter Notebook使用
- 7-7自动色阶/自动对比度/自动颜色
- Excel关于超级链接的宏命令
- 【特征提取】基于matlab倒谱距离端点检测【含Matlab源码 1767期】
- 不要VIP,想看啥就看啥的在线网站!
- 10分钟学会数据地图制作,让你的可视化再高一级!
- python写监控脚本_python写个进程监控的脚本
- RPC框架的使用场景
- Windows10桌面优化 | 如何修改图标大小 | 如何把win10快捷方式小箭头去掉
- MFC/VC++中怎样将一个位图添加到数据库中并且将其读出来到指定的Picture控件上
- oracle 10g ora12560,OracleORA-12560解决方法
- 万字干货:大道至简,用户增长模型体系/完整方法论/实操经验分享
- 网络学习(第十六篇-ICMP协议)
- AI人工智能识别技术如何助力构建风险监测预警系统?
- 如何通过ABB代理程序备份群晖DSM系统
热门文章
- 修改图片拓展名,转换图片格式
- 虚拟环境命令+linux基本操作(各种版本查看+进程操作+目录+文件)
- local_umask=022是什么意思?
- speedoffice怎么在word里设置上下标?
- 1196: 7210 计算指数
- pthread_cond_wait详解
- 黑马传智播客第三十六期前端最新学习视频分享
- “ Linux 和 Kubernetes 正在成为一切的平台”—— 对话全球最大独立开源公司 SUSE CTO...
- 大数据毕设系列项目说明 【源码+论文】
- 盘古开源解析:大数据时代,如何守护数据的信息安全?