首页 > 其他分享 >买卖股票的最佳时机专题(动态规划)

买卖股票的最佳时机专题(动态规划)

时间:2023-04-24 19:35:46浏览次数:29  
标签:vector 专题 int 最佳时机 prices 动态 public dp size

一. 买卖一次(简单)

dp[i]表示第i天卖出时的最大值,可以用滚动变量优化

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> dp(n+1);
        int min_= INT_MAX;
        for(int i=0;i<n;i++){
            dp[i+1]=max(dp[i],prices[i]-min_);
            min_=min(min_,prices[i]);//记录已经遍历的最小值
        }
        return dp[n];
    }
};

二. 买卖无数次(中等)

dp[i][j]表示第i天持股状态j下的最大收益,可以用滚动变量优化

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //dp[i][j]表示第i天持股状态j下的最大收益
        int n = prices.size();
        int dp[n+1][2];
        dp[0][0] = 0; dp[0][1] = -prices[0];//边界条件
        for(int i=0;i<n;i++){
            dp[i+1][0] = max(dp[i][0],dp[i][1]+prices[i]);//第i天不持股
            dp[i+1][1] = max(dp[i][1],dp[i][0]-prices[i]);//第i天持股
        }
        return dp[n][0];
    }
};
贪心对大于0的差值求和(特解)
class Solution {
public:
    int maxProfit(vector<int>& prices) {   
        int ans = 0;
        int n = prices.size();
        for (int i = 1; i < n; ++i) {
            ans += max(0, prices[i] - prices[i - 1]);
        }
        return ans;
    }
};

三. 最多进行两笔交易(困难)

dp[i][j][k]表示第i天持有状态j交易次数k下的最大利润

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();//将买入视作进行了一次交易,然后卖出就可以从当前买入状态进行转移
        int dp[n+1][2][3];//dp[i][j][k]表示第i天持有状态j交易次数k下的最大利润
        for(int i=0;i<n;i++)
            dp[i+1][0][0] = 0;//多余边界初始化0
        for(int j=0;j<2;j++){
            dp[0][0][j+1] = 0;//多余边界初始化0
            dp[0][1][j+1] = -prices[0];//这里直接给初值,没必要再使用多余空间
        }
        for (int i = 0; i < n; i++) {
            for(int j=0;j<2;j++){
                dp[i+1][1][j+1] = max(dp[i][1][j+1],dp[i+1][0][j]-prices[i]);//第j次买入
                dp[i+1][0][j+1] = max(dp[i][0][j+1],dp[i+1][1][j+1]+prices[i]);//第j次卖出
            }
        }
        return dp[n][0][2];
    }
};
四个滚动变量优化 ``` class Solution { public: int maxProfit(vector& prices) { int n = prices.size();//将持有视作进行了一次交易,然后卖出就可以从持有状态进行转移 int hold1 = -prices[0], sell1 = 0; int hold2 = -prices[0], sell2 = 0; for (int i = 1; i < n; ++i) { hold1 = max(hold1, -prices[i]);//进行一次交易的持有状态 sell1 = max(sell1, hold1 + prices[i]);//进行一次交易的卖出状态 hold2 = max(hold2, sell1 - prices[i]);//进行两次交易的持有状态 sell2 = max(sell2, hold2 + prices[i]);//进行两次交易的卖出状态 } return sell2; } }; ```

四. 最多进行k笔交易(困难)

dp[i][j][k]表示第i天持有状态j交易次数k下的最大利润

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();//将买入视作进行了一次交易,然后卖出就可以从当前买入状态进行转移
        int dp[n+1][2][k+1];//dp[i][j][k]表示第i天持有状态j交易次数k下的最大利润
        for(int i=0;i<n;i++)
            dp[i+1][0][0] = 0;//多余边界初始化0
        for(int j=0;j<k;j++){
            dp[0][0][j+1] = 0;//多余边界初始化0
            dp[0][1][j+1] = -prices[0];//这里直接给初值,没必要再使用多余空间
        }
        for (int i = 0; i < n; i++) {
            for(int j=0;j<k;j++){
                dp[i+1][1][j+1] = max(dp[i][1][j+1],dp[i+1][0][j]-prices[i]);//第j次买入
                dp[i+1][0][j+1] = max(dp[i][0][j+1],dp[i+1][1][j+1]+prices[i]);//第j次卖出
            }
        }
        return dp[n][0][k];
    }
};

五. 买卖无限次含冷冻期一天

dp[i][j]表示第i天状态为j的情况下最大利润

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int dp[n+1][3];
        for(int i=0;i<3;i++)
            dp[0][i] = 0;//多余边界初始化0
        dp[0][0] = -prices[0]; //直接赋初值,使能进入循环
        for (int i = 0; i < n; ++i) {
            dp[i+1][0] = max(dp[i][0],dp[i][2]-prices[i]);//持有股票状态
            dp[i+1][1] = dp[i][0] + prices[i];//卖出股票且在冷冻期
            dp[i+1][2] = max(dp[i][2], dp[i][1]);//卖出股票且不在冷冻期
        }
        return max(dp[n][1],dp[n][2]);
    }
};

六.买卖无限次含手续费

与题二基本一致

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        //dp[i][j]表示第i天持股状态j下的最大收益
        int n = prices.size();
        int dp[n+1][2];
        dp[0][0] = 0; dp[0][1] = -prices[0]-fee;//边界条件
        for(int i=0;i<n;i++){
            dp[i+1][0] = max(dp[i][0],dp[i][1]+prices[i]);//第i天不持股
            dp[i+1][1] = max(dp[i][1],dp[i][0]-prices[i]-fee);//第i天持股
        }
        return dp[n][0];
    }
};

标签:vector,专题,int,最佳时机,prices,动态,public,dp,size
From: https://www.cnblogs.com/929code/p/17350596.html

相关文章

  • springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、j
    由于在开发业务时,可能同时调用的存储过程不知道参数,但是参数从界面、或已经存储在数据库的获取,所以就不希望手动写存储过程的参数,通过简化的调用。能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来,这个就通用了。只写一个通用方法,就可以......
  • bat脚本动态匹配adb devices返回的设备ID
    在windows环境下新建一个bat脚本,填入以下内容@echooffechosendcommand:adbdevicesadbdevicesfor/f%%iin('adbdevices')do(sets=%%i)echocurrentdeviceis%s%pause打印结果如下:sendcommand:adbdevicesListofdevicesattachedAE6PWS49NFMB798H......
  • 3DMax Ornatrix to UE Groom制作毛发动态效果
    Hello,大家好,今天给大家带来3DMaxOrnatrix毛发插件导入UEGroom毛发动态效果,我是沙漠骆驼-JFD。1、使用Ornatrix毛发插件生成毛发2、添加编辑器Clump和Frizz3、导出格式:OrnatrixAlembic(.abc)4、导入到虚幻引擎,注意毛发的路径不要有中文,缩放Y要-1,不然毛发是反的;5......
  • 掌握动态规划,从“什么问题适合用”及“解题思路”入手
    摘要:一般是用动态规划来解决最优问题。本文分享自华为云社区《深入浅出动态规划算法(中)》,作者:嵌入式视觉。一,“一个模型三个特征”理论讲解一个模型指的是适合用动态规划算法解决的问题的模型,这个模型也被定义为“多阶段决策最优解模型”。具体解释如下:一般是用动态规划来解......
  • Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新
    Hystrix简介Hystrix是Netflix开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮。这里对Hystrix本身不做过多介绍。Hystrix目前处于维护状态(不再更新),但是还有大量项目对它进行了使用,因此仍然非常重要。基本用法在Hystrix中,HystrixCommand是非常......
  • 2023-04-23 算法面试中常见的动态规划问题
    动态规划1什么是动态规划以菲波那切数列求和为例,通过1.普通的递归2.引入记忆数组memo3.自下而上地解决问题,即动态规划动态规划的定义dynamicprogramming(alsoknownasdynamicoptimization)isamethodforsolvingacomplexproblembybreakingitdowninto......
  • 专题目录图标搜索说明
    可以使用对应的图标搜索对应的专题文章。专题标题专题图标Java基础♨Java集合❂Java并发㉿SpringBoot㊫SpringCloud☁         ......
  • 手游(明日方舟)营收与社区动态评论关系分析
    importpandasaspdimportnumpyasnpimportmatplotlibasmpfrompandas.core.algorithmsimportSelectN,diffimportseabornassefrommatplotlibimportpyplotaspltimportwordcloudimportjiebaimportloggingfromPILimportImage##设置中文plt.rcPa......
  • java动态生成页面
    1.java中动态生成html具体适用哪些情况除了发布新闻那些的。答:数据量大,且增删改查频繁的。2.购物网站如果访问量不是很大。商品详细页面是否有必要也动态生成HTML?答:明显有必要,因为商品详细要经常修改,一般不改页面,改的是数据3.如果动态生成了HTML......
  • 动态展示当前时间
     <template><div><H1>当前日期:{{FormatTime(nowTime)}}</H1></div></template><script>exportdefault{data(){return{timer:undefined,nowTime:newDate(),latedata:"20......