当前位置: 首页 > news >正文

P1439 【模板】最长公共子序列

题目描述

给出 1 , 2 , … , n 1,2,\ldots,n 1,2,,n 的两个排列 P 1 P_1 P1 P 2 P_2 P2 ,求它们的最长公共子序列。

输入格式

第一行是一个数 n n n

接下来两行,每行为 n n n 个数,为自然数 1 , 2 , … , n 1,2,\ldots,n 1,2,,n 的一个排列。

输出格式

一个数,即最长公共子序列的长度。

输入输出样例 #1

输入 #1

5 
3 2 1 4 5
1 2 3 4 5

输出 #1

3

说明/提示

  • 对于 50 % 50\% 50% 的数据, n ≤ 1 0 3 n \le 10^3 n103
  • 对于 100 % 100\% 100% 的数据, n ≤ 1 0 5 n \le 10^5 n105

题目分析

类似题目:友好城市。

把题目转化一下:
每一个数只会在两个串之间出现一次,我们要将这两个数字连起来,这样就会产生一条线段,每两条线段之间不能有交叉,求解最多可添加的线段条数

如何添加更多线段?

假设现在有两个线段,端点分别为 x 1 , y 1 x_1,y_1 x1,y1 x 2 , y 2 x_2,y_2 x2,y2 能添加的条件就是 $x_1 < x_2 $ 且 y 1 < y 2 y_1 < y_2 y1<y2

这样只需要让两个端点的值尽量小并且都保持从小到大的顺序
这不就是最长上升子序列吗!

可以以任意一个位置为关键字由小到大排序,再求另一个关键字所组成的最长不下降子序列长度,输出即可

定义: d p [ i ] dp[i] dp[i] 长度为 i i i 的最长上升子序列的最小结尾

算法: 二分减少时间复杂度

for(int i = 1 ; i <= n ; i++){
  if(cty[i].second > dp[cnt])dp[++cnt] = cty[i].second;
  //比最大的还大,直接加一个新的
  else *lower_bound(dp+1,dp+cnt+1,cty[i].second) = cty[i].second;
  //找到第一个比他大的替换
}

AC代码

#include<bits/stdc++.h>

using namespace std;

const int SIZN = 1e5 + 10;

int n;
pair<int,int> cty[SIZN];
int dp[SIZN],cnt = 0;
bool cmp(pair<int,int> a,pair<int,int> b){
    return a.first < b.first;
}
signed main(){
    cin >> n;
    for(int i = 1 ; i <= n ; i++){
        int k;
        cin >> k;
        cty[k].first = i;
    }
    for(int i = 1 ; i <= n ; i++){
        int k;
        cin >> k;
        cty[k].second = i;
    }
    sort(cty+1,cty+n+1,cmp);
    for(int i = 1 ; i <= n ; i++){
        if(cty[i].second > dp[cnt])dp[++cnt] = cty[i].second;
        else *lower_bound(dp+1,dp+cnt+1,cty[i].second) = cty[i].second;
    }
    cout << cnt;
    return 0;
}

相关文章:

  • STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的实践方式
  • poi-tl
  • 全能格式转换器v16.3.0.159绿色便携版
  • 合并区间、插入区间~
  • 【LLM基础】Megatron-LM相关知识(主要是张量并行机制)
  • 无线通信网
  • leetcode 322. Coin Change
  • 谷歌25年春季新课:15小时速成机器学习
  • 【2025年认证杯数学中国数学建模网络挑战赛】C题 数据预处理与问题一二求解
  • 如何使用CAPL解析YAML文件?
  • Python爬虫第13节-解析库pyquery 的使用
  • C++ | 时间日期
  • WEB 前端学 JAVA(一)
  • Qwen2.5-7B-Instruct FastApi 部署调用教程
  • YOLO学习笔记 | YOLOv8 全流程训练步骤详解(2025年4月更新)
  • 知行之桥2025版账号密码修改和重置指南
  • .NET WPF 可视化树(Visual Tree)
  • MCP工具的配置文件格式是怎么样的?MCP教程平台推荐
  • RVOS-3.实现内存管理
  • Compose 适配 - 响应式排版 自适应布局
  • 电商网站建设信息/黑马程序员培训机构在哪
  • 做网站会遇到的问题/网页怎么制作
  • 东莞集团网站建设/b2b网站平台
  • 中国建设手机银行网站/广州网站优化外包
  • wordpress https登陆/搜索优化师
  • 定制一个企业网站多少钱/电商网站推广方案