【leetcode C++】动态规划

16. 123. 买股票的最佳时机3

题目:

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

题目链接

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

文字分析

 代码

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
         int n = prices.size();
         vector<vector<int>> f(n,vector<int>(3));
         vector<vector<int>> g(n,vector<int>(3));
         f[0][0] = prices[0] * -1;
         f[0][1] =  prices[0] * -1;;
         f[0][2] =  prices[0] * -1;;
         for(int i = 1;i < n;i++)
         {
            for(int j = 0;j < 3;j++)
            {
                f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if(j - 1 >= 0)
                {
                    g[i][j] = max(g[i][j],f[i - 1][j - 1] + prices[i]);
                }
            }
         }
         int Max = g[n - 1][0];
             for(int j = 0;j < 3;j++)
             {
                  Max = max(Max,g[n - 1][j]);
             }
         return Max;
    }
};

17. 188. 买股票的最佳时机4

题目:

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

题目链接

188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

文字分析

原理 和 16 买股票的最佳时机3 一样,可以参考

代码

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) 
    {
           int n = prices.size();
         vector<vector<int>> f(n,vector<int>(k + 1));
         vector<vector<int>> g(n,vector<int>(k + 1));
         for(int i = 0;i <= k;i++)
         {
              f[0][i] = prices[0] * -1;
         }
         for(int i = 1;i < n;i++)
         {
            for(int j = 0;j <= k;j++)
            {
                f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if(j - 1 >= 0)
                {
                    g[i][j] = max(g[i][j],f[i - 1][j - 1] + prices[i]);
                }
            }
         }
         int Max = g[n - 1][0];
             for(int j = 0;j <= k;j++)
             {
                  Max = max(Max,g[n - 1][j]);
             }
         return Max;
    }
};

18. 53 . 最大子数组和

题目:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

题目链接

53. 最大子数组和 - 力扣(LeetCode)

文字分析

 代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
       int n = nums.size();
       vector<int> dp(n);
       int Max =  dp[0] = nums[0];
       for(int i = 1;i < n;i++)
       {
         dp[i] = max(nums[i],dp[i - 1] + nums[i]);
         Max = max(Max,dp[i]);
       }
       return Max;
    }
};

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值