• day-49 代码随想录算法训练营(19) 动态规划 part 10


    121.买卖股票的最佳时机

    思路一:贪心
    • 不断更新最小买入值
    • 不断更新当前值和最小买入值的差值最大值

    思路二:动态规划(今天自己写出来了哈哈哈哈哈哈哈)
    • 1.dp存储:dp[i][0] 表示当前持有   dp[i][1]表示当前不持有
    • 2.状态转移方程(递推式)
      • dp[i][0]=max ( dp [ i - 1 ] [ 0 ] , - prices [ i ] )  之前就持有/当前买入
        • dp[i][1]=max ( dp [ i - 1 ] [ 1 ] , dp [ i - 1 ] [ 0 ] + prices [ i ] )  之前就没持有/当前卖出
    • 3.初始化:dp[0][0]=-prices[0]   dp[0][1] =0
    • 4.遍历顺序:1-n
    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int n=prices.size();
    5. vectorint>>dp(n,vector<int>(2));
    6. dp[0][0]=-prices[0];
    7. dp[0][1]=0;
    8. for(int i=1;i
    9. dp[i][0]=max(dp[i-1][0],-prices[i]);
    10. dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);
    11. }
    12. return dp[n-1][1];//最后肯定不持有利润最大
    13. }
    14. };

    122.买卖股票的最佳时机||(拿捏)

    思路一:贪心
    • 只要有利润增长就卖出,最后一定获得最大利润

    思路二:动态规划

    1.dp存储:dp[i][0]为持有  dp[i][1]为不持有

    2.状态转移方程(递推式):

    • dp [ i ] [ 0 ] = max ( dp [ i - 1 ] [ 0 ] , dp [ i - 1 ] [ 1 ] - prices [ i ] )  之前持有/现在买入(上一次不持有的金额 - 买入的金额)
    • dp [ i ] [ 1 ] = max ( dp [ i - 1 ] [ 1 ] , dp [ i - 1 ] [ 0 ] + prices [ i ] )  之前没持有/现在卖出(上一次持有的金额 + 卖出的金额)

    3.初始化:dp[0][0]=-prices[0]   dp[0][1]=0

    4.遍历顺序:1-n

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int n=prices.size();
    5. vectorint>>dp(n,vector<int>(2));
    6. dp[0][0]=-prices[0];
    7. dp[0][1]=0;
    8. for(int i=1;i
    9. dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
    10. dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);
    11. }
    12. return dp[n-1][1];
    13. }
    14. };

    123.买卖股票的最佳时机|||

    思路:动态规划(5个状态)
    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int n=prices.size();
    5. vectorint>>dp(n,vector<int>(5,0));
    6. dp[0][1]=-prices[0];
    7. dp[0][3]=-prices[0];
    8. for(int i=1;i
    9. dp[i][0]=dp[i-1][0]; //第一天不持有
    10. dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]); //第一天买入
    11. dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i]); //第一天卖出
    12. dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i]); //第二天买入
    13. dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i]);
    14. }
    15. return dp[n-1][4];
    16. }
    17. };

  • 相关阅读:
    java压缩pdf体积,图片体积
    SSD【目标检测篇】
    cookie以及Storage的共同点、区别与使用
    有效提升Python代码性能的三个层面
    数据可视化工具在成绩分析中的作用与意义
    记录一些遇到的数学概念
    Win11如何优化服务?Win11优化服务的方法
    Golang之双向认证
    xen-uart
    第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 C: 班级活动
  • 原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/132825061