当前位置:   article > 正文

小山菌_代码随想录算法训练营第四十七天| 1143.最长公共子序列、1035.不相交的线 、 53. 最大子序和、392.判断子序列

小山菌_代码随想录算法训练营第四十七天| 1143.最长公共子序列、1035.不相交的线 、 53. 最大子序和、392.判断子序列

1143.最长公共子序列

文档讲解:代码随想录. 最长公共子序列
视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列
状态:已完成

代码实现

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>> dp(text1.size() + 1,
                               vector<int>(text2.size() + 1, 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]);
                }
            }
        }

        return dp[text1.size()][text2.size()];
    }
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

心得体会

  1. 需要注意dp的递推公式,在相同和不相同时的变化

1035.不相交的线

文档讲解:代码随想录.不相交的线
视频讲解:动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线
状态:已完成

class Solution {
public:
    int maxUncrossedLines(vector<int>& A, vector<int>& B) {
        vector<vector<int>> dp(A.size() + 1, vector<int>(B.size() + 1, 0));
        for (int i = 1; i <= A.size(); i++) {
            for (int j = 1; j <= B.size(); j++) {
                if (A[i - 1] == B[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[A.size()][B.size()];
    }
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

心得体会

  1. 做题时有时候需要将问题抽象化,这个和上面是一样的

53. 最大子序和

文档讲解:代码随想录.最大子序和
视频讲解:看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和
状态:已完成

class Solution {
public:
    int maxSubArray(vector<int>& nums) {

        if (nums.size() ==0)
            return 0;

        vector<int> dp(nums.size());
        dp[0]=nums[0];
        int result = dp[0];
        for (int i = 1; i < nums.size(); i++) {

            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
            if (dp[i] > result)
                result = dp[i];
        }

        return result;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

心得体会

  1. 初始化的时候应该赋值给数组的第一个值,因为这里是求和

392.判断子序列

文档讲解:代码随想录.判断子序列
视频讲解:动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列
状态:已完成

class Solution {
public:
    bool isSubsequence(string s, string t) {
        vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));
        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];
            }
        }
        if (dp[s.size()][t.size()] == s.size()) return true;
        return false;
    }
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

心得体会

  1. 这里只对长的t字符串进行删除,其它和上面的一样
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/900851
推荐阅读
相关标签
  

闽ICP备14008679号