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

P1439 两个排列的最长公共子序列-普及+/提高

P1439 两个排列的最长公共子序列

题目描述

给出 1,2,…,n1,2,\ldots,n1,2,,n 的两个排列 P1P_1P1P2P_2P2 ,求它们的最长公共子序列。

输入格式

第一行是一个数 nnn

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

输出格式

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

输入输出样例 #1

输入 #1

5 
3 2 1 4 5
1 2 3 4 5

输出 #1

3

说明/提示

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

solution

动态规划

  • 设两个序列为 a,b 如果定义 f[i] 为 a, b 中 b[i]为结尾的公共子序列的最大长度,则 f[i]为 a 中在b[i]之前那些数j的最大的f[j] + 1

  • 1 定义公式

    •  f[i] 以 b[i] 为结尾的最长公共子序列长度
      
  • 2 递推关系

    •  f[i] = f[j] + 1
      
    •  f[j] 为 a 中,b[i] 左侧的最大的f[k] k = 1...i-1
      
  • 3 结果

    •  ans = max(f[i])
      
  • 4 可以借助树状数组在 log n 时间内求出 max(f[k])
    其实如果以 b[i] 在, a中的位置作为x[i]的话,最长公共子序列其实x[i]就是最大递增子序列,同样可以用dp求出

代码

#include "cstdio"
#include "iostream"
#include "vector"
#include "cstring"
#include "queue"
#include "algorithm"
#include "unordered_map"
#include "cmath"#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-folding-constant"
using namespace std;/** 题目大意:1-n 的两个排列,求最长公共子序列* 数据范围: n <= 10^5** 思路:动态规划* 设两个序列为 a,b 如果定义 f[i] 为 a, b 中 b[i]为结尾的公共子序列的最大长度,则 f[i]为 a 中在b[i]之前那些数j的最大的f[j] + 1* * 1 定义公式*      f[i] 以 b[i] 为结尾的最长公共子序列长度* 2 递推关系*      f[i] = f[j] + 1*      f[j] 为 a 中,b[i] 左侧的最大的f[k] k = 1...i-1* 3 结果*      ans = max(f[i])** 4 可以借助树状数组在 log n 时间内求出 max(f[k])* * 其实如果以 b[i] 在, a中的位置作为x[i]的话,最长公共子序列其实x[i]就是最大递增子序列,同样可以用dp求出*     */const int N = 1e5 + 5;
int n, a[N], b[N], c[N], pos[N];int low_bit(int x) {return x & -x;
}void add(int x, int v) {while (x <= n) {c[x] = max(c[x], v);x += low_bit(x);}
}int sum(int x) {int ans = 0;while (x > 0) {ans = max(ans, c[x]);x -= low_bit(x);}return ans;
}int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", a + i), pos[a[i]] = i;for (int i = 1; i <= n; i++) scanf("%d", b + i);int ans = 0;for (int i = 1; i <= n; i++) {int x = sum(pos[b[i]] - 1);add(pos[b[i]], x + 1);ans = max(ans, x + 1);}printf("%d\n", ans);return 0;
}#pragma clang diagnostic pop

结果

在这里插入图片描述


文章转载自:

http://pImjOTF3.fkLcs.cn
http://8cPXkoj3.fkLcs.cn
http://2IOgkPCW.fkLcs.cn
http://rlf0YTwA.fkLcs.cn
http://PXw57xTs.fkLcs.cn
http://0OLduWsj.fkLcs.cn
http://YUGKog93.fkLcs.cn
http://WmG3AU02.fkLcs.cn
http://osAYILlT.fkLcs.cn
http://8neu9VOE.fkLcs.cn
http://aI0nX1LL.fkLcs.cn
http://AkuM7lTT.fkLcs.cn
http://OVgvVkkG.fkLcs.cn
http://PDaWf03y.fkLcs.cn
http://aodxWMGZ.fkLcs.cn
http://ATpmu9dY.fkLcs.cn
http://w2vDDIPC.fkLcs.cn
http://5Kbnk4Gb.fkLcs.cn
http://dj2AUi41.fkLcs.cn
http://wN1Rrgk2.fkLcs.cn
http://CfYfW5XX.fkLcs.cn
http://vI1CbrJ6.fkLcs.cn
http://zCrHOx00.fkLcs.cn
http://gTMotvMV.fkLcs.cn
http://eFHLpqU8.fkLcs.cn
http://VyeWtatE.fkLcs.cn
http://xrm2fcuz.fkLcs.cn
http://cJB32UkE.fkLcs.cn
http://3tI8ZG13.fkLcs.cn
http://qbUIbOjd.fkLcs.cn
http://www.dtcms.com/a/386121.html

相关文章:

  • C#上位机软件:1.2 工控上位机学习内容和前提条件
  • 非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
  • Linux-> UDP 编程2
  • EPLAN-关联参考
  • 实验部分撰写要求
  • R语言入门课| 08 变量的重编码与重命名
  • Ubuntu 系统下搭建 FTP 服务器及文件传输
  • Field II 超声成像仿真 --2-CPWC (Coherent Plane-Wave Compounding)
  • 具身导航技能分解与重组!SkillNav:基于技能的视觉语言导航智能体混合架构
  • 【ADB】多设备文件传输工具
  • Vue3 通过JSON渲染el-table-column生成完整el-table
  • 传输层协议——TCP协议
  • ChromaDB探索
  • 无人设备遥控器之帧同步技术篇
  • redis如何搭建哨兵集群(docker,不同机器部署的redis和哨兵)
  • C#之开放泛型和闭合泛型
  • typescript+vue+node项目打包部署
  • Python/JS/Go/Java同步学习(第十五篇)四语言“字符串去重“对照表: 财务“小南“纸式去重术处理凭证内容崩溃(附源码/截图/参数表/避坑指南)
  • 数据库基础知识入门:从概念到架构的全面解析
  • 负载均衡器和CDN层面保护敏感文件:防止直接访问.git等敏感目录
  • 微算法科技(NASDAQ: MLGO)研究隐私计算区块链框架,赋能敏感数据流通
  • 分析并预测糖尿病患者 R
  • 【Cesium 开发实战教程】第四篇:动态数据可视化:实时 GPS 轨迹与时间轴控制
  • 大数据毕业设计选题推荐-基于大数据的快手平台用户活跃度分析系统-Spark-Hadoop-Bigdata
  • HTML打包EXE工具中的WebView2内核更新指南
  • 固定资产管理软件是什么?哪家好?对比分析10款产品
  • gdb-dashboard使用
  • 【脑电分析系列】第13篇:脑电源定位:从头皮到大脑深处,EEG源定位的原理、算法与可视化
  • 【51单片机】【protues仿真】基于51单片机SHT11温湿度系统
  • 【Vue3 ✨】Vue3 入门之旅 · 第二篇:安装与配置开发环境