最长公共上升子序列LCIS

news2024/11/25 6:42:58

最长公共上升子序列LCIS


题目链接: acwing272. 最长公共上升子序列
题目描述:
在这里插入图片描述
输入输出:
在这里插入图片描述
题解:
首先考虑 最长上升子序列和 最长公共子序列问题
最长上升子序列的状态表示与状态转移如下:

状态表示:
用f[i],来表示以A[i]结尾的A[1~i]最长上升子序列的长度(注意,该上升子序列结尾为A[i])
状态转移:
mx=0
for(int k=1;k<i;k++)
	if(A[k]<A[i]) mx=max(mx,f[k]);
f[i]=mx+1;

最长公共子序列的状态表示与状态转移如下:

状态表示:
用f[i][j]来表示A[1~i]与B[1~j]的最长公共子序列
状态转移:
if(A[i]==B[j]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);

由上面的这两个,我们来写最长公共上升子序列LCIS的状态表示与状态转移:

状态表示:
用f[i][j]来表示以B[j]为结尾(结尾为B[j])的A[1~i]与B[1~j]的最长公共上升子序列长度
状态转移:
考虑两种情况:
if(A[i]!=B[j]) f[i][j]=f[i-1][j];//这个很好理解,如果A[i]!=B[j],
//那么以B[j]为结尾(结尾为B[j])的A[1~i]与B[1~j]的最长公共上升子序列一定在A[1~i-1]与B[1~j]中
else{
	//此时A[i]==B[j],我们要在A[1~i-1]与B[1~j-1]中到一个最长的公共上升子序列,并且子序列的结尾还要小于B[j]==A[i],
	//这样才能将A[i]与B[j]接在其后面
	mx=0;
	for(int k=1;k<j;k++)
		if(B[k]<B[j]) mx=max(mx,f[i-1][j]);//这里B[j]==A[i],判断条件中也能写成A[i](用于后续优化)
	f[i][j]=mx+1;
}

代码如下: O ( n 3 ) O(n^3) O(n3)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=3010;
int f[N][N];
int main(){
    int n;
    int A[N],B[N];
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&A[i]);
    for(int i=1;i<=n;i++) scanf("%d",&B[i]);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(A[i]!=B[j]) f[i][j]=f[i-1][j];
            else{
                int mx=0;
                for(int k=1;k<j;k++)
                    if(A[i]>B[k]) mx=max(mx,f[i-1][k]);
                f[i][j]=mx+1;
            } 
        }
    }
    int t=0;
    for(int i=1;i<=n;i++)
        if(f[n][i]>t) t=f[n][i];
    cout<<t;
    return 0;
}

我们考虑对代码进行优化,可以在第二层循环中顺便求出A[i]>B[k]的最大值
代码如下: O ( n 2 ) O(n^2) O(n2)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=3010;
int f[N][N];
int main(){
    int n;
    int A[N],B[N];
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&A[i]);
    for(int i=1;i<=n;i++) scanf("%d",&B[i]);
    for(int i=1;i<=n;i++){
        int mx=0;
        for(int j=1;j<=n;j++){
            if(A[i]!=B[j]) f[i][j]=f[i-1][j];
            else f[i][j]=mx+1;
            if(B[j]<A[i]) mx=max(mx,f[i-1][j]);
        }
    }
    int t=0;
    for(int i=1;i<=n;i++)
        if(f[n][i]>t) t=f[n][i];
    cout<<t;
    return 0;
}

参考博客

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

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

相关文章

WPF教程(三)--事件Event调用

1、WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时&#xff0c;应用程序才停止运行。 ShutDown 是隐式或显式发生&#xff0c;可以通过指定 ShutdownMode 的属性值来进行设置。 对ShutdownMode选项的更改&#xff0c;可以直接在App.xaml中更改&a…

coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)

目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…

【初学ROS,年轻人的第一个Node节点】

【初学ROS&#xff0c;年轻人的第一个Node节点】 1. 工作空间设置2. 创建Package3. 回访依赖包4. 创建Node节点5. 源码编译6. 运行Node节点7. Node节点完善8. 总结 本教程是B站阿杰视频的笔记 视频地址&#xff1a;https://www.bilibili.com/video/BV1nG411V7HW 超声波传感器 …

界面组件DevExtreme v22.2新版亮点 - 各UI组件增强升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

geometric distribution and exponential distribution(几何分布和指数分布)

几何分布 分布函数均值和方差意义 表示经过k次实验才第一次得到正确的实验结果 比如抛硬币得到正面的需要抛的次数 指数分布 分布函数均值和方差意义 表示经过一段x之后&#xff0c;某件事第一次发生 比如经过x时间之后&#xff0c;公交车来的概率 比如餐厅从开业到第一个客人…

基于ArcGIS 服务获取气象栅格某点位值及数据更新

1. 背景 假如有很多气象数据&#xff0c;不想通过后台脚本去获取数据&#xff0c;想通过前台服务的rest接口去识别&#xff0c;并且这些栅格数据可能是需要更新变化的&#xff0c;以下对一些技术方法做一个简单的介绍。 需求概述&#xff1a; 点击某一个点&#xff0c;获取影…

设计模式 --- 概述

一、设计模式概述 1.1、软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 克里斯托夫亚历山大 &#xff08;Christopher Alexander&…

c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式

c/c:三维数组&#xff0c;字符数组和字符串&#xff0c;统计字符串中字符出现的频次&#xff0c;scanf输入空格&#xff0c;正则匹配表达式 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知…

WPF教程(十一)---数据绑定(4)--数据类绑定

一、排序 如果想以特定的方式对数据进行排序&#xff0c;可以绑定到 CollectionViewSource&#xff0c;而不是直接绑定到 ObjectDataProvider。CollectionViewSource 则会成为数据源&#xff0c;并充当截取 ObjectDataProvider 中的数据的媒介&#xff0c;并提供排序、分组和筛…

PMP项目管理-[第六章]进度管理

进度管理知识体系&#xff1a; 规划进度管理&#xff1a; 定义活动&#xff1a; 排列活动顺序&#xff1a; 估算活动持续时间&#xff1a; 制定进度计划&#xff1a; 6.1 规划进度管理 定义&#xff1a;为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档的过程 作…

docker简单教程(三)常用操作

docker简单教程&#xff08;三&#xff09;常用操作 文章目录 docker简单教程&#xff08;三&#xff09;常用操作1&#xff1a;查看所有容器列表&#xff1a;docker ps -a2&#xff1a;查看正在运行的容器列表&#xff1a;docker ps3&#xff1a;运行容器&#xff1a;docker r…

内网渗透之横向移动wmismb密码喷射CrackMapExec

0x01 横向移动之wmi wmi可以通过hash或明文进行验证&#xff0c;不会在系统日志中留下痕迹&#xff0c;使用139端口 复现环境&#xff1a; god.org win2008 dc win2012sql win2008 web 准备&#xff1a; cs上线 win2008web 提权利用ms14-058 抓取hash和明文密码(当获取到其他…

重磅发布,时隔两月——复旦大学MOSS最新0.0.3版本发布

今天中午吃饭的时候无意间看到一则新闻说的就是复旦大学开发的MOSS也就是国产版的类chatGPT对话模型已经发布了最新版本0。0.3&#xff0c;目前公测期间是完全开源免费的&#xff0c;还是可以上手体验一下的。 官方的博客介绍在这里&#xff0c;首页如下所示&#xff1a; 如果…

手机端无线投屏技术及方案推荐

目前主流的无线投屏技术主要又DLNA&#xff0c;Miracast&#xff0c;Airplay。 对协议的描述引用知乎作者的文章&#xff0c;原文&#xff1a;AirPlay、Miracast 、DLNA三大协议对比 - 知乎 (zhihu.com) 【DLNA】 DNLA&#xff0c;Digital Living Network Alliance&#xff…

光照的个人推导过程与GL实现

目录 1、前提知识 1.1、GL的绘图过程&#xff1a; 1.2、点积的规则和作用&#xff1a; 1.3、normalize在方向处理上的作用 2、光照控制的理论基础 2.1、自由的实现&#xff1a; 2.2、带有方向性的光——基于dot product的实现 最终效果演示如下&#xff1a; 3、关键代…

可能是史上最详细的MySQL用户和权限原理和实战

前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

Python - Jupyter - 远程连接Jupyter内核

Python - Jupyter - 远程连接Jupyter内核 前言 假设你有一台高性能服务器&#xff08;电脑B&#xff09;&#xff0c;并且在上面安装好了Jupyter 现在你想使用你自己常用的电脑&#xff08;电脑A&#xff09;编码&#xff0c;但使用电脑B的计算资源。 怎么办呢&#xff1f;…

WPS以普通会员价格升级超级会员

文章目录 一、新会员体系二、基本原理三、升级超级会员1、购买会员时长2、成功通知3、兑换时长 一、新会员体系 4月17日&#xff0c;WPS会员体系全新升级。本次升级&#xff0c;WPS将原“WPS会员”、“稻壳会员”及“超级会员”合并、升级&#xff0c;推出全新的“WPS超级会员…

235:vue+openlayers 绘制带有径向渐变填充色的圆形

第235个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有径向渐变填充色的圆形。 如果填充线性渐变的多边形,可以参考这个篇文章 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共136行)相关A…

通过python代码自定义ssh密码爆破

通过python代码自定义ssh密码爆破 一&#xff0c;这段代码的意义&#xff1a;二&#xff0c;直接上写好的代码:三&#xff0c;使用pip3 install paramiko 命令安装库四&#xff0c;使用 python3 test.py 主机地址 -u 用户名 -p 字典路径/五&#xff0c;字典的选取 一&#xff0…