力扣hot100——动态规划 & 多维动态规划

前言:题太多了TAT,只贴了部分我觉得比较好的题

32. 最长有效括号

cpp 复制代码
class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size();
        s = " " + s;
        vector<int> dp(n + 1, 0);
        int ans = 0;
        for (int i = 2; i <= n; i++) {
            if (s[i] == '(') dp[i] = 0;
            else {
                if (s[i - 1] == '(') dp[i] = dp[i - 2] + 2;
                else {
                    int pre = i - 2 - dp[i - 1];
                    if (s[pre + 1] == '(') dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre] : 0);
                }
            }
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

分类讨论:

si == '(' : 肯定dpi = 0

si == ')': 看si - 1的是不是'(', 如果不是再往前找...

注意dppre会连接起来

152. 乘积最大子数组

cpp 复制代码
class Solution {
public:
    int maxProduct(vector<int>& a) {
        int n = a.size();
        vector<vector<int>> dp(n, vector<int>(2, 0));
        dp[0][0] = dp[0][1] = a[0];
        int ans = a[0];
        for (int i = 1; i < n; i++) {
            if (!a[i]) dp[i][1] = dp[i][0] = 0;
            else if (a[i] > 0) {
                if (dp[i - 1][1] > 0) dp[i][1] = dp[i - 1][1] * a[i];
                else dp[i][1] = a[i];
                if (dp[i - 1][0] <= 0) dp[i][0] = dp[i - 1][0] * a[i];
                else dp[i][0] = a[i];
            }
            else {
                if (dp[i - 1][0] <= 0) dp[i][1] = dp[i - 1][0] * a[i];
                else dp[i][1] = a[i];
                if (dp[i - 1][1] > 0) dp[i][0] = dp[i - 1][1] * a[i];
                else dp[i][0] = a[i];
            }
            ans = max({ ans, dp[i][0], dp[i][1] });
        }
        return ans;
    }
};

分类大讨论,维护以i为结尾的乘积最大值和最小值即可

72. 编辑距离

cpp 复制代码
class Solution {
public:
    int minDistance(string s1, string s2) {
        int n = s1.size(), m = s2.size();
        if (!n) {
            return m;
        }
        if (!m) {
            return n;
        }
        s1 = " " + s1;
        s2 = " " + s2;
        vector<vector<int>> dp(n + 1, vector<int>(m + 1, 1e5));
        dp[0][0] = 0;
        for (int i = 1; i <= n; i++) dp[i][0] = i;
        for (int i = 1; i <= m; i++) dp[0][i] = i;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int t = min({ dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1] }) + 1;
                dp[i][j] = min(dp[i][j], t);
                if (s1[i] == s2[j]) dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
            }
        }
        return dp[n][m];
    }
};

5. 最长回文子串

cpp 复制代码
class Solution {
public:
    string longestPalindrome(string s) {
        string str = "";
        str.push_back('$');
        str.push_back('#');
        for (auto ch : s) {
            str.push_back(ch);
            str.push_back('#');
        }
        int n = str.size() - 1;
        vector<int> d(n + 10, 0);
        d[1] = 1;
        for (int i = 2, l, r = 1; i <= n; i++) {
            if (i <= r) d[i] = min(d[l + r - i], r - i + 1);
            while (str[i - d[i]] == str[i + d[i]]) d[i]++;
            if (i + d[i] - 1 > r) {
                l = i - d[i] + 1;
                r = i + d[i] - 1;
            }
        }


        int ans = 0;
        int p = 0;
        string ss = "";
        for (int i = 1; i <= n; i++) {
            if (ans < d[i] - 1) {
                ans = d[i] - 1;
                p = i - d[i] + 1;
            }
        }
        for (int i = p; ans > 0 ; i++) {
            if (str[i] != '#') {
                ss += str[i];
                ans--;
            }
        }

        return ss;
    }
};
相关推荐
YaraMemo15 分钟前
元启发式算法框架
人工智能·算法·5g·信息与通信·启发式算法·信号处理
weixin_3077791336 分钟前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN1 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL2 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕2 小时前
滑动窗口算法实战指南
python·算法
DisonTangor2 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手
明月_清风4 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣4 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
hetao17338374 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J4 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动