代码随想录第47天|动态规划

1143.最长公共子序列


cpp 复制代码
class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
        int res = 0;
        for (int i = 1; i <= text1.size(); i++) {
            for (int j = 1; j <= text2.size(); j++) {
                if (text1[i - 1] == text2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
                //res = max(res, dp[i][j]);
            }
        }
//        return res;
		return dp[text1.size()][text2.size()]; //最长公共子序列一定在末尾
    }
};

如图 j = 1 时, i 在 1 ~ text1.size 之间时, 即 a 在 abcde 的子序列长度


1035. 不相交的线


相当于寻找其最大的子序列, 此时的结果最大

cpp 复制代码
class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1));
        for (int i = 1; i <= nums1.size(); i++) {
            for (int j = 1; j <= nums2.size(); j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[nums1.size()][nums2.size()];
    }
};

53. 最大子序和



cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp(nums.size());
        dp[0] = nums[0];
        int res = dp[0];
        for (int i = 1; i < nums.size(); i++) {
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
            res = max(res, dp[i]);
        }
        return res;
    }
};

392.判断子序列


思路1 : 双指针

思路2 : 动态规划

cpp 复制代码
class Solution {
public:
    bool isSubsequence(string s, string t) {
        vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1));
        for (int i = 1; i <= s.size(); i++) {
            for (int j = 1; j <= t.size(); j++) {
                if (s[i - 1] == t[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = dp[i][j - 1];
                }
            }
        }
        return s.size() == dp[s.size()][t.size()] ? true : false;
    }
};
相关推荐
不想写笔记16 小时前
算法 C语言 冒泡排序
c语言·笔记·算法·排序算法
xu_yule16 小时前
算法基础-路径类dp
算法
智驱力人工智能16 小时前
从项目管理视角 拆解景区无人机人群密度分析系统的构建逻辑 无人机人员密度检测 无人机人群密度检测系统价格 低空人群密度统计AI优化方案
人工智能·深度学习·算法·安全·无人机·边缘计算
历程里程碑16 小时前
C++ 4:内存管理
java·c语言·开发语言·数据结构·c++·笔记·算法
The Last.H16 小时前
Codeforces Round 1069 (Div. 2)
算法
LYFlied16 小时前
【每日算法】LeetCode 76. 最小覆盖子串
数据结构·算法·leetcode·面试·职场和发展
LXS_35717 小时前
Day17 C++提高 之 类模板案例
开发语言·c++·笔记·算法·学习方法
小年糕是糕手17 小时前
【C++】string类(一)
linux·开发语言·数据结构·c++·算法·leetcode·改行学it
初願致夕霞17 小时前
LeetCode双指针题型总结
算法·leetcode·职场和发展
努力学算法的蒟蒻17 小时前
day36(12.17)——leetcode面试经典150
算法·leetcode·面试