动态规划算法专题四--两个数组dp问题

目录

题四十 最长公共子序列

 题四十一 不相交的线

 题四十二 不同子序列

 题四十三 通配符匹配


题四十 最长公共子序列

1143. 最长公共子序列 - 力扣(LeetCode)

题解:

状态方程:dp[i][j]:表示s1字符串[0,i]区间和s2字符串[0,j]区间,最长公共子序列。

根据方程进行推导:分两种情况讨论当s1[i] == s2[j] / s1[i] != s2[j]

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        //1、创建dp表
        int n = text1.size();
        int m = text2.size();
        vector<vector<int>> dp(n+1, vector<int>(m+1));

        //2、初始化
        text1 = " " + text1;
        text2 = " " + text2;

        //3、填表
        for(int i = 1; i<n+1; ++i)
        {
            for(int j = 1; j<m+1; ++j)
            {
                if(text1[i] == text2[j])
                {
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                else
                {
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }

        //返回值
        return dp[n][m];

    }
};

 题四十一 不相交的线

1035. 不相交的线 - 力扣(LeetCode)

题解:

状态方程:dp[i][j]:nums1序列[0,i]区间和nums2序列[0,j]区间,有多少个不相交线。

根据方程进行推导:分两种情况讨论当s1[i] == s2[j] / s1[i] != s2[j]

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        //1、创建dp表
        int m = nums1.size();
        int n = nums2.size();
        vector<vector<int>> dp(m+1, vector<int> (n+1));

        //2、初始化

        //3、填表
        for(int i = 1; i<m+1; ++i)
        {
            for(int j = 1; j<n+1; ++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]);
                }
            }
        }

        //4、返回值
        return dp[m][n];




    }
};    



 题四十二 不同子序列

LCR 097. 不同的子序列 - 力扣(LeetCode)

题解:

dp[i][j]:表示[0,i]区间的s串,有多少个[0,j]区间的t串。

根据此状态方程推导。

class Solution {
public:
    int numDistinct(string s, string t) {
        //1、创建dp表
        int m = s.size();
        int n = t. size();
        vector<vector<double>> dp(m+1, vector<double> (n+1));

        //2、初始化
        for(int i = 0; i<m+1; ++i)
        {
            dp[i][0] = 1;
        }

        //3、填表
        for(int i = 1; i<m+1; ++i)
        {
            for(int j = 1; j<n+1; ++j)
            {
                dp[i][j] += dp[i-1][j];
                if(s[i-1] == t[j-1])
                {
                    dp[i][j] += dp[i-1][j-1];
                }
            }
        }

        //4、返回值
        return dp[m][n];
        
    }
};

 题四十三 通配符匹配

44. 通配符匹配 - 力扣(LeetCode)

题解:

dp[i][j]:表示[0,i]区间的s串,有多少个[0,j]区间的t串。

根据此状态方程推导。

相关推荐

  1. 动态规划算法专题--数组dp问题

    2024-07-16 23:44:01       20 阅读
  2. 算法专题动态规划之简单多状态 dp 问题

    2024-07-16 23:44:01       45 阅读
  3. 算法动态规划dp问题),持续更新

    2024-07-16 23:44:01       63 阅读
  4. 算法 & 动态规划 &路径问题】二维dp问题

    2024-07-16 23:44:01       32 阅读
  5. C++分组背包问题_动态规划dp_背包_算法竞赛

    2024-07-16 23:44:01       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 23:44:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 23:44:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 23:44:01       58 阅读
  4. Python语言-面向对象

    2024-07-16 23:44:01       69 阅读

热门阅读

  1. 如何检查对象中键是否存在?

    2024-07-16 23:44:01       22 阅读
  2. 【嵌入式】面试笔试问题整理 (持续更新)

    2024-07-16 23:44:01       22 阅读
  3. 微信小程序-组件通信

    2024-07-16 23:44:01       19 阅读
  4. 【C语言实现双向循环链表】

    2024-07-16 23:44:01       22 阅读
  5. 前端面试题日常练-day88 【面试题】

    2024-07-16 23:44:01       18 阅读
  6. flex主轴元素控制优先级

    2024-07-16 23:44:01       18 阅读