LeetCode刷题——动态规划(C/C++)

文章介绍了四个编程题目,包括寻找买股票的最佳时机以获取最大利润、爬楼梯的解决方案、找到数组中的最长递增子序列以及计算最大连续子数组和,所有问题均涉及动态规划算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[简单]买股票的最佳时机

原题链接

  • 题解
    min:今天之前买股的最低价
    res:最大利润
    每一天比较今天和往前的最低价差值能否比最大利润还大
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int min = INT_MAX;
        int res = 0;
        for (int i = 0; i < prices.size(); i++) {
            if (prices[i] < min) {
                min = prices[i];
            }
            if ((prices[i] - min )> res) {
                res = prices[i] - min;
            }
        }
        return res;
    }
};

[简单]爬楼梯

原题链接

  • 题解
    走到第n阶的方法数其实就正好包括
    (1)走到第n-1阶之后再走一阶
    (2)走到第n-2阶之后再走两阶。
    注意:走到第n-2阶之后只能算上再走两阶的方案,因为如果加上再走两次一阶,就会和(1)里面的方案重复
class Solution {
public:
    int climbStairs(int n) {
        int f[n+1];
        if(n>=1)
            f[1]=1;
        if(n>=2)
            f[2]=2;
        if(n>=3){
            for(int i=3;i<=n;i++){
            f[i]=f[i-1] + f[i-2];
        }
        }
        return f[n];
    }
};

[中等]最长递增子序列

原题链接

  • 题解
    f[i]来表示以i为结尾的最大递增子序列长度,先给定所有单个数字最长字段各自为1,即f[i]=1(即只包括自己)
    然后从左往右遍历, 每遍历到i,都嵌套遍历一次i之前所有的数nums[j]是否小于nums[i],如果是的话,就有了一段基于f[j]+1长度的递增子序列,进而找出以i为末尾的最长递增子序列
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int f[2550];
        for (int i = 0; i < nums.size(); i++) {
            f[i] = 1;
        }
        for (int i = 1; i < nums.size(); i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j] && (f[j] + 1)> f[i])
                    f[i] = f[j] + 1;
            }
        }
        int max = 1;
        for(int i=0;i<nums.size();i++){
            if(f[i]>max) max=f[i];
        }
        return max;
    }
};

[中等]最大连续子数组和

原题链接

  • 题解
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int f[100010];
        f[0] = nums[0];
        for(int i=1;i<nums.size();i++){
            f[i]= max(nums[i],f[i-1]+nums[i]);
        }
        int max = f[0];
        for(int i=1;i<nums.size();i++){
            if (f[i]>max) max = f[i];
        }
        return max;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值