最长公共上升子序列——DP

熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。
小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了。
小沐沐说,对于两个数列 A 和 B,如果它们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列,而所有的公共上升子序列中最长的就是最长公共上升子序列了。
奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子序列。
不过,只要告诉奶牛它的长度就可以了。

数列 A 和 B 的长度均不超过 3000。

输入
第一行包含一个整数 N,表示数列 A,B 的长度。
第二行包含 N 个整数,表示数列 A。
第三行包含 N 个整数,表示数列 B。

输出
输出一个整数,表示最长公共上升子序列的长度。

数据范围
1 ≤ N ≤ 3000,序列中的数字均不超过 2e31−1。

Input
4
2 2 1 3
2 1 2 3

Output
2

解析:
这道题是最长公共子序列和最长上升子序列的结合。
f[i][j] 表示第一序列前 i 个数和第二序列前 j 个数,且以 b[j] 结尾的公共上升子序列 的集合。
f[i][j]的值表示 这个集合中的长度最大值。
状态转移:f[i][j]可分为 包含 a[i] 和不包含 a[i] 两类.
1.不包含 a[i] : f[i][j]=f[i-1][j];
2.包含 a[i] : 
当 a[i] ≠ b[j] 时,相当于 不包含 a[i],f[i][j]=f[i-1][j];
当 a[i]  =  b[j] 时,就是 f[i][j]=max(f[i][j],f[i-1][k]+1),其中 (1 ≤ k < j)。   //可借鉴 最长上升子序列。

暴力算法 O(n^3),一定超时啦。
可以发现 在当 a[i]=b[j],寻找 f[i-1][k]的最大值的过程中,每次遍历一次循环很费时。
可以预处理一个值,在之前的过程中不断更新它,因为在每算一个状态的时候,都是从之前的状态转移过来的。
这样还能省去一层循环,时间复杂度 O(n^2)。 

代码一:暴力算法,未优化 

#include <bits/stdc++.h>
#include <math.h>
using namespace std;
//#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=3010;
int n;
int a[N],b[N];
int f[N][N];
void solve()
{cin>>n;for (int i=1;i<=n;i++) cin>>a[i];for (int i=1;i<=n;i++) cin>>b[i];for (int i=1;i<=n;i++)for (int j=1;j<=n;j++){f[i][j]=f[i-1][j];if (a[i]==b[j]){f[i][j]=max(f[i][j],1);for (int k=1;k<j;k++){if (b[k]<a[i]) f[i][j]=max(f[i][j],f[i-1][k]+1);}}}int ans=0;for (int i=1;i<=n;i++) ans=max(ans,f[n][i]);cout<<ans;
}
int main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}

代码二:优化后 

#include <bits/stdc++.h>
#include <math.h>
using namespace std;
//#define int long long     //开 long long 暴空间
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=3010;
int n;
int a[N],b[N];
int f[N][N];
void solve()
{cin>>n;for (int i=1;i<=n;i++) cin>>a[i];for (int i=1;i<=n;i++) cin>>b[i];for (int i=1;i<=n;i++){int maxx=1;for (int j=1;j<=n;j++){f[i][j]=f[i-1][j];if (a[i]==b[j]) f[i][j]=max(f[i][j],maxx);if (b[j]<a[i]) maxx=max(maxx,f[i-1][j]+1);      //只有此时才更新 maxx}}int ans=0;for (int i=1;i<=n;i++) ans=max(ans,f[n][i]);cout<<ans;
}
int main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1Maven分模块设计与开发

目录 1.1 介绍 1.2 实践 1.2.1模块进行拆分 1.3 总结 首先&#xff1a;Maven 是一款构建和管理 Java 项目的工具 1.1 介绍 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多个模块进行开发。 1). 未分模…

c# 实体对象 序列化 帮助类

ublic class SerializeHelper { /// <summary> /// 序列化 实体->字符串 /// </summary> /// <returns></returns> public static string SerializeObject(object obj) { var str…

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息&#xff0c;但是发和收消息是只是MQ最基本的功能了&#xff0c;在收发消息的过程中&#xff0c;会有很多的问题需要去解决&#xff0c;下面需要学习rabbitMQ的高级特性去解决 死信交换机&#xff1a;这个可以帮助我们实现消息的延迟的…

深入了解Elasticsearch索引生命周期管理

在今天的数据驱动世界中&#xff0c;Elasticsearch因其强大的搜索和分析能力而受到许多企业和开发者的青睐。随着数据量的不断增长&#xff0c;如何高效地管理这些数据成为了一个挑战。Elasticsearch索引生命周期管理&#xff08;ILM&#xff09;就是为解决这一问题而设计的。本…

数据库管理-第14期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#xff0c…

docker run报 docker: Error response from daemon: no command specified.

docker run报 docker: Error response from daemon: no command specified. 1. export出mysql的container为tar, 拷贝到另一台虚拟机, import该tar为image, docker run该image时报 docker: Error response from daemon: no command specified. 时间240211 export出mysql的con…

如何做快团团帮卖团长?怎么找到更多的帮卖团长?

如何做快团团帮卖团长&#xff1f; 快团团可以卖货赚钱&#xff0c;不用囤货 任何人都可以成为帮卖团长 有流量的可以快团团 有产品也可以快团团 如果能找到货源&#xff0c;也可以做快团团 一时间&#xff0c;宝妈、代购、传统电商淘宝&#xff0c;淘客都在转行快团团 …

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

蓝桥杯每日一解

可以看看a的ascii码为6532 而A为ascii码为65&#xff0c;大小写相差32位 #include <iostream>using namespace std; int main(){int n;cin >> n;char a;for (int i 1;i<n;i){while(scanf("%c",&a) ! EOF){//无限输入直到输入到空格if(a a || a …

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言快捷栏绘制UI代码控制快捷列表信息 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将探索如何制作…

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

vue核心技术(二)

◆ 指令补充 指令修饰符 通过 "." 指明一些指令 后缀&#xff0c;不同 后缀 封装了不同的处理操作 → 简化代码 v-bind 对于样式控制的增强 为了方便开发者进行样式控制&#xff0c; Vue 扩展了 v-bind 的语法&#xff0c;可以针对 class 类名 和 style 行内样式…

KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340)ABCDEF 视频讲解

这场比较郁闷&#xff0c;C题短路&#xff0c;连续4次WA&#xff0c;导致罚时太多 A - Arithmetic Progression Problem Statement Print an arithmetic sequence with first term A A A, last term B B B, and common difference D D D. You are only given inputs for w…

BootstrapBlazor 模板适配移动设备使用笔记

项目模板 Bootstrap Blazor App 模板 为了方便大家利用这套组件快速搭建项目&#xff0c;作者制作了 项目模板&#xff08;Project Templates&#xff09;&#xff0c;使用 dotnet new 命令行模式&#xff0c;使用步骤如下&#xff1a; 安装项目模板 dotnet new install Boo…

007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码&#xff0c;离了指针是很难办到的。 2、因为VB/VBA里&#xff0c;用Long来表示指针&#xff0c;而32位(包括64位兼容的)计算机里4字节整数的处理&#xff0c;是最快的方式&#xff01; 3、要想用指针来处理数据&#xff0c;…

fast.ai 深度学习笔记(六)

深度学习 2&#xff1a;第 2 部分第 12 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-12-215dfbf04a94 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;…

Vue-55、Vue技术vuex模块化

一、代码 1、store.js //改文件用于创建最为核心的store //引入vue import Vue from "vue"; //引入vuex import Vuex from vuex;//求和功能相关的配置 const countOptions{namespaced:true,actions:{jia:function (context,value) {console.log(action中的jia被调…