IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Mdp] lc1035. 不相交的线(LCS+LIS+重点知识理解) -> 正文阅读

[数据结构与算法][Mdp] lc1035. 不相交的线(LCS+LIS+重点知识理解)

1. 题目来源

链接:1035. 不相交的线

相关:


力赞题解,知识总结,对比 LCS 与 LIS 特性,深挖 LCS 状态分类,三叶姐yyds:

2. 题目解析

很有意思的一道题,不亏是小马AI,题单里的,哈哈。

一开始以为是做过的一道 思维+LIS,[线性dp] aw1012. 友好城市(最长上升子序列模型+思维)。看了看发现不是,然后就直接 dp 吧。然后发现和 lcs 思考过程一模一样…

做完之后看了三叶姐的题解,深受启发。 【宫水三叶の相信科学系列】求「最值问题」只需要确保「不漏」即可


  • 时间复杂度 O ( n m ) O(nm) O(nm)
  • 空间复杂度 O ( n m ) O(nm) O(nm)

代码:

写法一:四种情况的分类划分,状态之间有重叠,但不影响最值。经典的 LCS 状态划分。

在这里插入图片描述

图片取自 传送门:【宫水三叶の相信科学系列】求「最值问题」只需要确保「不漏」即可。 强烈建议看看分析。再去看看 [线性dp] aw897. 最长公共子序列(重要模板题+最长公共子序列模型)

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size(), m = nums2.size();
        vector<vector<int>> f(n + 1, vector<int>(m + 1));

        for (int i = 1; i <= n; i ++ ) 
            for (int j = 1; j <= m; j ++ ) {
                f[i][j] = max(f[i - 1][j], f[i][j - 1]);
                if (nums1[i - 1] == nums2[j - 1]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
            }

        return f[n][m];
    }
};

写法二:LCS 的优化,仅判断 a[i]==b[j],只分两种情况,状态转移加 if-else,代码结构与朴素版的一样。更加简洁。

其实经过仔细比对,会发现,当 a[i]==b[j] 时,状态一定由 f[i-1][j-1]+1 进行转移,就不需要通过 f[i][j] = max(f[i - 1][j], f[i][j - 1]); 这个转移了。但朴素的写法,会将这个放到前面,使其先判断不等,再判断相等。

重点理解:

  • 其中,a[i]==b[j] 只需要 f[i][j]=f[i-1][j-1]+1 参与状态转移,而不需要其它的来进行大小比较。例如和四种状态划分一样,当 a[i]==b[j] 时,f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+1) 这三个值来比大小。以其中一个为例,f[i][j-1] 相较于 f[i-1][j-1]+1 是多了一个 a[i] 元素的,那么如果这个 a[i] 元素匹配了 b 串中的某一个,也不过是 +1 的贡献量,顶多与 f[i-1][j-1]+1 持平。如果不匹配,甚至还不如 f[i-1][j-1]+1,那么取 max 自然取不到它。 所以直接通过 f[i][j]=f[i-1][j-1]+1 进行状态转移。
  • 所以,在 a[i]==b[j] 状态转移时进行一个小优化。两种方法的代码实现将完全一致。
class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size(), m = nums2.size();
        vector<vector<int>> f(n + 1, vector<int>(m + 1));

        for (int i = 1; i <= n; i ++ ) 
            for (int j = 1; j <= m; j ++ ) {
                if (nums1[i - 1] == nums2[j - 1]) f[i][j] = f[i - 1][j - 1] + 1;    // 直接转移
                else f[i][j] = max(f[i - 1][j], f[i][j - 1]);
            }

        return f[n][m];
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:21:37  更:2021-08-26 12:21:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:24:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码