8分钟学会 带有冷冻期的最佳买入股票时机 问题(内有C++调试源码)

光看题目,无形之中就为这道题增加了难度,这里边需要考虑的问题更多,需要详细了解其内容,可以搜索代码随想录,我也是看了他的文章后才会大有启发,制作了简易的思维导图,声明一下,我不是创作者,我只是创作者的搬运工,还有可能搬的有些遗漏,主要是对自己的学习的一个总结,方便自己抽时间去复习主要内容和思想。

接下来请看例题:

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例: 输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

解释:因为中间有冷冻期,所以我们就得考虑冷冻期这一天是没有办法进行操作的,那么主要有一下几个状态需要去考虑:

0代表买入股票状态的最大价值:

dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));

1代表保持卖出股票:

 

 dp[i][1]=max(dp[i-1][1],dp[i-1][3]);

2代表今天卖出股票: 

dp[i][2]=dp[i-1][0]+prices[i];

3代表今天是冷冻期: 

dp[i][3]=dp[i-1][2];

接下来需要考虑初始化:

dp[0][0]表示在第0天进行买入,所以手里的价值为dp[0][0]=-prices[0];

dp[0][1]:在第0天之前根本就不存在买入和冰冻期,所以现在处于卖出状态的价值初始化为0;

dp[0][2]:在第0天之前也根本不存在买入和冰冻期,所以这一天卖出的价值也初始化为0;

dp[0][3]:在第0天之前也根本不存在买入,所以现在也不存在冰冻期,那么初始化也为0.

接下来coding:

#include <iostream>
#include <vector>
using namespace std;
int maxPrices(vector<int> &prices)
{
    int len=prices.size();
    vector<vector<int>>dp(prices.size(),vector<int>(4,0));
    dp[0][0]=-prices[0];
    for(int i=1;i<prices.size();++i)
    {
        dp[i][0]=max(dp[i-1][0],max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));
        dp[i][1]=max(dp[i-1][1],dp[i-1][3]);
        dp[i][2]=dp[i-1][0]+prices[i];
        dp[i][3]=dp[i-1][2];
    }
        return max(dp[len-1][3],max(dp[len-1][1],dp[len-1][2]));
}
int main()
{
    vector<int> price={1,2,3,0,2};
    int val=maxPrices(price);
    cout<<"最大价值为:"<<val<<endl;
    return 0;
}

以上代码亲测有效!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值