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

【模板】最长公共子序列 详细解析

原题:link,点击这里喵。
朴素 dp:

首先考虑朴素的 dp,记 wxw_xwxxxx 在序列 AAA 中的位置,显然我们有以下转移方程:

dpi=max⁡j<i∧wBi>wBjdpj+1dp_i=\max_{j<i \land w_{B_i}>w_{B_j}}dp_j+1 dpi=j<iwBi>wBjmaxdpj+1

解释:如果我们要从之前的序列转移过来,那么一定要满足当前元素的下标在 AAABBB 中都要分别在被转移的元素后面,时间复杂度为 O(n2)O(n^2)O(n2)

优化 dp:

观察朴素 dp,我们要求的便是在当前元素下标之前的最大 dp 值,即之前的元素在 AAA 中下标比当前元素小,因为不用差分,考虑使用树状数组维护比某下标小的 dp 最大值,此时查询满足条件的时间复杂度变为 O(log⁡n)O(\log n)O(logn),总时间复杂度优化为 O(nlog⁡n)O(n\log n)O(nlogn)

树状数组写法:

struct traymax{#define lowbit(x) ((x)&(-x))int g[N];void update(int b,int k){while(b<N){g[b]=max(g[b],k);b+=lowbit(b);}}int query(int b){int temp=0;while(b){temp=max(temp,g[b]);b^=lowbit(b);}return temp;}
}t;
code:
#include <bits/stdc++.h>#define inf 0x3f3f3f3f
typedef long long lnt;using namespace std;const int N = 2e5;#define lowbit(x) ((x) & (-x))struct traymax {int g[N];void update(int b, int k) {while (b < N) {g[b] = max(g[b], k);b += lowbit(b);}}int query(int b) {int temp = 0;while (b) {temp = max(temp, g[b]);b ^= lowbit(b);}return temp;}
} t;int w[N], date[N], dp[N], n, ans;int main() {scanf("%d", &n);for (int i = 1; i <= n; ++i) {scanf("%d", &w[i]);}for (int i = 1; i <= n; ++i) {scanf("%d", &date[i]);dp[i] = t.query(w[date[i]]) + 1;t.update(w[date[i]], dp[i]);ans = max(ans, dp[i]);}printf("%d", ans);return 0;
}
http://www.dtcms.com/a/276271.html

相关文章:

  • FastGPT革命:下一代语言模型的极速进化
  • 集训Demo1
  • 史上最全 MySQL 锁详解:从理论到实战,一篇搞定所有锁机制
  • 接口和抽象方法示例
  • C语言基础知识--联合体
  • Mybatis的一级缓存与二级缓存
  • 电网失真下单相锁相环存在的问题
  • STM32第二十一天定时器TIM
  • docker搭建 与镜像加速器
  • LeetCode经典题解:3、无重复字符的最长子串
  • 【Elasticsearch】post_filter
  • 【MATLAB代码】Chan方法解算TOA,用于三维目标的定位,锚点数量可自适应。订阅专栏后可查看完整代码
  • Windows环境下解决Matplotlib中文字体显示问题的详细指南
  • PyTorch神经网络实战:从零构建图像分类模型
  • linux----------------------线程同步与互斥(上)
  • 搭建MySQL读写分离
  • LiteFlow源码
  • Mamba架构的模型 (内容由deepseek辅助汇总)
  • 手把手教你 Aancond 的下载与 YOLOV13 部署(环境的创建及配置下载)以及使用方法,连草履虫都能学会的目标检测实验!
  • net.createServer详解
  • Python后端项目之:我为什么使用pdm+uv
  • 模拟注意力:少量参数放大 Attention 表征能力
  • hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
  • 深入解析C#接口实现的两种核心技术:派生继承 vs 显式实现
  • Java 21 虚拟线程
  • 浏览器宏任务的最小延时:揭开setTimeout 4ms的神话
  • java中的main方法
  • window7,windows10,windows11种系统之间实现打印机共享
  • 创客匠人:从定位逻辑看创始人 IP 如何驱动 IP 变现
  • CompareFace使用