代码随想录算法训练营第四十四天|leetcode309、714题

一、leetcode第309题

本题对于买卖股票加入了冷冻期的限制,因此设置dp数组分为四个状态:买入股票状态、卖出股票状态(两天前卖出股票或前一天卖出股票一直没有操作)、今天卖出股票状态、冷冻期状态。

具体代码如下:

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
    vector<vector<int>>dp(prices.size(),vector<int>(4,0));
    //dp[0][0]持有股票
    //dp[0][1]卖出股票状态
    //dp[0][2]今天卖出股票
    //dp[0][3]冷冻期
    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];
    }  
    int m=prices.size()-1;
    return max(dp[m][1],max(dp[m][2],dp[m][3]));  
    }
};

二、leetcode第714题

本题与求买卖股票最大利润的区别仅在于加入了手续费,因此在不持有股票状态的递推公式中减去手续费即可。

具体代码如下:

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
    vector<vector<int>>dp(prices.size(),vector<int>(2,0));
    dp[0][0]=-prices[0];
    dp[0][1]=0;
    //dp[i][0]第i天持有股票
    //dp[i][1]第i天不持有股票
    for(int i=1;i<prices.size();i++)
    {
        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]-fee);
    }
    return dp[prices.size()-1][1];
    }
};
相关推荐
用户0390614707192 分钟前
无感观测器理论模型(NTSM-SMO-PLL 与 SMO-PLL)
算法
垆边人似月.12 分钟前
找出最小的 K 个数
数据结构·c++·算法
熊猫钓鱼>_>19 分钟前
当工具成为类:Softmax困境与连接器过载的算法根源
算法·ai·agent·工具·曲线·华为云码道·生态图鉴
信奥卷王27 分钟前
[GESP202503 六级] 树上漫步(含视频)
算法
Purple Coder1 小时前
南京-我来啦
算法
w_zero_one1 小时前
动态规划(三)
java·算法·动态规划
Logic1011 小时前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
DongQiShanRen1 小时前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
mmmmath_31 小时前
LeetCode.637.二叉树的层平均值
算法·leetcode
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛