C++算法第十四天

发布于:2025-02-11 ⋅ 阅读:(72) ⋅ 点赞:(0)

学完前面的算法题,相信大家的水平定是有所提升,那么今天我们来点难题开一下刀

第一题

题目链接

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

题目解析

代码原理

代码编写

class Solution {

public:

    int maxProfit(int k, vector<int>& prices) {

        const int INF = 0x3f3f3f3f;

        int n = prices.size();

        //细节处理

        k = min(k,n / 2);

        //建表

        vector<vector<int>> f(n, vector<int>(k + 1, -INF));

        auto g = f;

        //初始化

        f[0][0] = -prices[0], g[0][0] = 0;

        //填表

        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 res = 0;

        for(int j = 0; j <= k; j++)

        {

            res = max(g[n - 1][j], res);

        }

        return res;

    }

};

第二题

题目链接

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

题目解析

代码原理

代码编写

class Solution {

public:

    int maxProfit(vector<int>& prices) {

        const int INF = 0x3f3f3f3f;

        int n = prices.size();

        //建表

        vector<vector<int>> f(n,vector<int>(3,-INF));

        auto g= f;

        //初始化

        f[0][0] = -prices[0], g[0][0] = 0;

        //填表

        for(int i = 1; i < n; i++)

        {

            for(int j = 0; j <= 2; 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)

                g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);

            }

        }

        int res = 0;

        for(int j = 0; j <= 2; j++)

        {

            res = max(res, g[n - 1][j]);

        }

        return res;

    }

};

相信看到这里的小伙伴一定会有疑问,这两题的代码咋感觉差不多呢,是的博主也发现了,但是代码就是这样的

第三题

题目链接

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

题目解析

代码原理

代码编写

class Solution {

public:

    int maxSubArray(vector<int>& nums) {

        int n = nums.size();

        //建表

        vector<int> dp(n + 1);

        //初始化

        dp[0] = 0;//这里可以省略,因为vector会初始化为0

        //填表

        int ret = -0x3f3f3f3f;

        for(int i = 1; i <= n; i++)

        {

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

            ret = max(ret, dp[i]);

        }

        return ret;

    }

};

本篇文章的内容就先到这里,我们下期文章再见!!!!

记得一键三联哦!!!


网站公告

今日签到

点亮在社区的每一天
去签到