• 1035. 不相交的线(dp)


     

    难度中等

    在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

    现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:

    •  nums1[i] == nums2[j]
    • 且绘制的直线不与任何其他连线(非水平线)相交。

    请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

    以这种方法绘制线条,并返回可以绘制的最大连线数。

    示例 1:

    输入:nums1 = [1,4,2], nums2 = [1,2,4]
    输出:2
    解释:可以画出两条不交叉的线,如上图所示。 
    但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。
    

    示例 2:

    输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
    输出:3
    

    示例 3:

    输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
    输出:2



    class Solution {
    public:
        int maxUncrossedLines(vector<int>& text1, vector<int>& text2) {
            int n = text1.size();
            int m = text2.size();
            int dp[n+1][m+1];
            //dp[i][j]:长度为[0, i]的字符串text1与长度为[0, j]的字符串text2的最长公共子序列为dp[i][j]
            for(int i = 0 ;i < n+1;++i) {
                dp[i][0] = 0;
            }
            for(int j = 0 ;j < m+1;++j) {
                dp[0][j] = 0;
            }
            for(int i = 1;i <n+1;++i) {
                for(int j = 1; j < m+1;++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[n][m];
        }
    };
     
  • 相关阅读:
    C++进阶--placement new/delete
    mac_Mac item2常用快捷键
    linux_安装_安装编译phantomjs 2.0的方法_转
    linux_删除空文件(大小等于0的文件)的方法
    linux_根据关键词_路径下递归查找code
    linux_shell_获取日期相关
    php_中替换换行符
    linux_增加用户组_删除用户
    数据分析入门
    linux_vim_最佳快捷键
  • 原文地址:https://www.cnblogs.com/zle1992/p/16496343.html
Copyright © 2020-2023  润新知