当前位置:网站首页>动态规划股票问题对比
动态规划股票问题对比
2022-07-04 15:39:00 【折叠的饼干】
文章目录
核心还是状态转移,只要搞清每个状态是什么就非常简单
搞不清楚转移过程可以打表看看
这里从dp[i][j],i从1开始是因为习惯性想避开i-1导致越界
1
121. 买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
剑指 Offer 63. 股票的最大利润
买卖该股票一次可能获得的最大利润是多少?
解析:
这两个是同一道题,都是只能买一次卖一次
下面两种方法只是思考角度不同:
1.dp[i][0]和dp[i][1]分别代表无股票(可能是没买,可能是卖了)、有股票(只能买一次,所以不能叠加上次值)两种状态
%2是个节省空间的方法,可以不加
2.
dp[i][0]未买过
dp[i][1]买过一次,且未卖出
dp[i][2]买过一次,且卖出
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
vector<vector<int>>dp(2,vector<int>(2,0));
int ans=0;
dp[1][0]=0;
dp[1][1]=-prices[0];
for(int i=2;i<=len;i++){
dp[i%2][0]=max(dp[(i-1)%2][0],dp[(i-1)%2][1]+prices[i-1]);
dp[i%2][1]=max(dp[(i-1)%2][1],-prices[i-1]);
}
return dp[len%2][0];
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
if(len==0)return 0;
vector<vector<int>>dp(len+1,vector<int>(3,0));
dp[1][1]=-prices[0];
for(int i=2;i<=len;i++){
dp[i][0]=dp[i-1][0];
dp[i][1]=max(dp[i-1][0]-prices[i-1],dp[i-1][1]);
dp[i][2]=max(dp[i-1][1]+prices[i-1],dp[i-1][2]);
}
return dp[len][2];
}
};
2
122. 买卖股票的最佳时机 II
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
解析:
和1相比,可以多次买入卖出,意思就是买入可以叠加上次状态了
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
vector<vector<int>>dp(len+1,vector<int>(2,0));
dp[1][1]=-prices[0];
dp[1][0]=0;
for(int i=2;i<=len;i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i-1]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i-1]);
}
return dp[len][0];
}
};
3
123. 买卖股票的最佳时机 III
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
解析:
和2相比,限制买入次数,只能买入两次
就用5个状态标记
dp[i][0] 未买过
dp[i][1] 买过一次,并持有
dp[i][2] 买过一次,并卖了
dp[i][3]买过两次,并持有
dp[i][4]买过两次,并卖了
注意初始化,可以一天买了又卖又买
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
vector<vector<int>>dp(len+1,vector<int>(5,0));
dp[1][1]=-prices[0];
//注意一天可以买卖两次
dp[1][3]=-prices[0];
for(int i=2;i<=len;i++){
dp[i][0]=dp[i-1][0];
dp[i][1]=max(dp[i-1][0]-prices[i-1],dp[i-1][1]);
dp[i][2]=max(dp[i-1][1]+prices[i-1],dp[i-1][2]);
dp[i][3]=max(dp[i-1][2]-prices[i-1],dp[i-1][3]);
dp[i][4]=max(dp[i-1][3]+prices[i-1],dp[i-1][4]);
}
return dp[len][4];
}
};
4
188. 买卖股票的最佳时机 IV
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
解析:
和3相比,买入两次变k次
就用2k+1个状态标记
dp[i][0] 未买过
dp[2i+1][1] 买过一次,并持有
dp[ik+2][2] 买过一次,并卖了
然后一循环就完了
注意初始化,可以一天买了又卖又买又…
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int len=prices.size();
if(len==0)return 0;
vector<vector<int>>dp(len+1,vector<int>(2*k+1,0));
for(int i=0;i<k;i++){
dp[1][2*i+1]=-prices[0];
}
for(int i=2;i<=len;i++){
dp[i][0]=dp[i-1][0];
for(int j=0;j<k;j++){
dp[i][2*j+1]=max(dp[i-1][2*j]-prices[i-1],dp[i-1][2*j+1]);
dp[i][2*j+2]=max(dp[i-1][2*j+1]+prices[i-1],dp[i-1][2*j+2]);
}
}
return dp[len][2*k];
}
};
5
714. 买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
解析:
跟2相比,在卖出时-fee就行
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int len=prices.size();
vector<vector<int>>dp(len+1,vector<int>(2,0));
dp[1][1]=-prices[0];
for(int i=2;i<=len;i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i-1]-fee);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i-1]);
}
return dp[len][0];
}
};
边栏推荐
- 聊聊异步编程的 7 种实现方式
- Go语言循环语句(第10课下)
- SQL implements split
- 祝贺Artefact首席数据科学家张鹏飞先生荣获 Campaign Asia Tech MVP 2022
- Datakit -- the real unified observability agent
- World Environment Day | Chow Tai Fook serves wholeheartedly to promote carbon reduction and environmental protection
- NoSQL之readis配置与优化(终章)
- leetcode:421. The maximum XOR value of two numbers in the array
- APOC custom functions and procedures
- leetcode:421. 数组中两个数的最大异或值
猜你喜欢
周大福践行「百周年承诺」,真诚服务推动绿色环保
居家打工年入800多万,一共五份全职工作,他还有时间打游戏
如何实现一个延时队列 ?
ble HCI 流控机制
世界环境日 | 周大福用心服务推动减碳环保
超大规模数仓集群在大型商业银行的落地实践
Analysis of abnormal frequency of minor GC in container environment
Visual studio 2019 (localdb) mssqllocaldb SQL Server 2014 database version is 852 and cannot be opened. This server supports 782
一文掌握数仓中auto analyze的使用
Blood spitting finishing nanny level series tutorial - play Fiddler bag grabbing tutorial (2) - first meet fiddler, let you have a rational understanding
随机推荐
Sequence diagram data modeling and industrial chain analysis
Smart Logistics Park supply chain management system solution: digital intelligent supply chain enables a new supply chain model for the logistics transportation industry
Using win10 scheduling task program to automatically run jar package at fixed time
To sort out messy header files, I use include what you use
新享科技发布小程序UniPro小优 满足客户移动办公场景
OPPO小布推出预训练大模型OBERT,晋升KgCLUE榜首
Firebird experience summary
Which domestic cloud management platform manufacturer is good in 2022? Why?
Go语言循环语句(第10课下)
【模板】【luogu P4630】Duathlon 铁人两项(圆方树)
Yanwen logistics plans to be listed on Shenzhen Stock Exchange: it is mainly engaged in international express business, and its gross profit margin is far lower than the industry level
散列表
长城证券开户安全吗 证券账户怎么开通
照明行业S2B2B解决方案:高效赋能产业供应链,提升企业经济效益
Chow Tai Fook fulfills the "centenary commitment" and sincerely serves to promote green environmental protection
Visual studio 2019 (localdb) mssqllocaldb SQL Server 2014 database version is 852 and cannot be opened. This server supports 782
Height residual method
Median and order statistics
第十八届IET交直流输电国际会议(ACDC2022)于线上成功举办
Can you really use MySQL explain?