【最长公共上升子序列】

news2024/12/27 15:36:27

题目

解决

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[j] > b[k])
                    f[i][j] = max(f[i][j], f[i - 1][k] + 1);
        }  
    }

先假设a[i]不影响结果,纳入f[i-1][j]

(实际上a[i]可能影响结果,在剩下的划分中考虑)

然后判断是否相同,如果相同,结合题设的b[j]影响结果得出a[i]对应b[j],此时长度至少为1

再通过枚举合法的“倒数第二个值”b[k]将答案进一步转移

(一般加常数的转移需要判断)(这里求最大值,ij越小值越小,所以可以先转移f[i-1][j],哪怕不是最优也不影响最终结果)

优化1:a[i] == b[j]下,b[j] > b[k] \Leftrightarrow a[i] > b[k]

此时,就可以维护一个g[i][j],借助之前的遍历j的结果来替代遍历k的结果

for (int i = 1; i <= n; ++ i) {
        g[i][0] = 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], g[i][j - 1]);
            g[i][j] = g[i][j - 1];
            if (a[i] > b[j]) g[i][j] = max(g[i][j], f[i - 1][j] + 1);
        }
}

g[i][j] \Leftrightarrow max(f[i-1][k]) + 1 , k \in [1,j] 

这样的话,在a[i]b[j]配对之后,想要尝试所有的转移只需要max一个g[i][j-1]

之后,当前层更新g[i][j],留待下层配对之后需要尝试转移时使用

(转移与否还要看是否配对,我先维护好这个结构,同时这个结构的维护也需要考虑合法性,即严格递增:注意有些ka[i] > b[j]过滤掉了)

优化2:注意到每个g[i][j]只会赋值一次,且运算只基于上一次的结果和无关项

#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
int f[N][N], maxik;
int a[N], b[N];
int main()
{
    int n;
    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++)
    {
        maxik = 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], maxik);
            if(a[i] > b[j]) maxik = max(maxik, f[i-1][j] + 1);
        }
    }
    
    int ans = 0;
    for (int i = 1; i <= n; ++ i) ans = max(f[n][i], ans);

    cout << ans << "\n";
    return 0;
}

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

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

相关文章

大语言模型的“智能飞轮”!阿里最新综述全面解析大模型的自进化之路

©PaperWeekly 原创 作者 | 林廷恩 单位 | 阿里通义实验室算法研究员 研究方向 | 自然语言处理 想象一下&#xff0c;一个 AI 不仅能学习&#xff0c;还能自我改进&#xff0c;变得越来越聪明。这不是科幻小说&#xff0c;而是我们正在见证的现实。大语言模型&#xff08;…

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式&#xff0c;但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办&#xff1f;今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码&#xff0c;打开密码和限制编辑&#xff0c;如果是因为打开密码&#xff0c;建议使…

全套安全帽佩戴检测算法源码与实战应用分享

在许多工业环境中&#xff0c;安全帽是确保工人安全的重要防护装备。为了降低工人受伤的风险&#xff0c;尤其是在建筑工地、矿山、工厂等高危环境下&#xff0c;确保工人正确佩戴安全帽是至关重要的。然而&#xff0c;由于现场管理的复杂性和人员流动性&#xff0c;单靠人工监…

Chrome H265 WebRTC 支持

Chrome从127版本开始支持RTC H265解码&#xff0c;这样服务器就不需要对H265转码了&#xff0c; H5S和USC会自动检测浏览器支持的解码类型并自动判断是否启动转码&#xff0c;这样客户端不用关心摄像机具体是H264还是H265&#xff0c;尽量使用带GPU的客户端&#xff0c;这样服务…

什么是红黑树-面试中常问的数据结构

你有没有想过,为什么你的 Java HashMap 能够如此高效地处理数百万个键值对?或者你的 Linux 系统是如何在眨眼间就能管理成千上万的进程的?这些看似神奇的性能背后,隐藏着一个优雅而强大的数据结构 - 红黑树。 目录 什么是红黑树?红黑树的特性为什么需要红黑树?红黑树的结…

java基础 之 抽象类

文章目录 前言抽象类浅浅的理解下抽象类关键字&#xff1a;abstract抽象类 VS 普通类特点 前言 1、类是一个模板&#xff0c;类被继承后成为父类&#xff0c;继承父类的类称为子类。 2、子类可以对父类的方法进行重写&#xff0c;也可以直接使用父类的方法。 3、类称为继承&…

鸿蒙笔记--WorkerTaskPool

这一节了解一下鸿蒙中的Worker和TaskPool,Worker和TaskPool的作用是为应用程序提供一个多线程的运行环境&#xff0c;用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程&#xff0c;从而最大化系统的利用率&#xff0c;降低整体资源消耗&#xff0c;并…

python动画:manim中的颜色【ManimColor】的使用方法

一&#xff0c;什么是彩色(颜色) Color是视觉艺术不可或缺的一部分&#xff0c;但我们怎么知道它如此重要呢&#xff1f;嗯&#xff0c;一种方法是通过色彩理论的应用。什么是色彩理论&#xff1f;我们将定义色彩理论&#xff0c;然后分解来自绘画、照片和电影的各种色彩理论示…

活动预告 | Global RAG Hack Together Ⅲ-用VS Code AI Tools结合SLM构建RAG应用

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 九月&#xff0c;Global RAG Hack Together 即将在全球开启&#xff0c;在这场全球 RAG 黑客松中&#xff0c;我们不仅可以学习到生成式 AI 下的 RAG 技术&#xff0c;还可以用我们掌握的 RAG 技术提交参…

python读取calibre的opf文件到表格

opf文件之一&#xff1a; python 将 Calibre Library 里面所有opf文件的title&#xff0c;creator&#xff0c;date&#xff0c;description&#xff0c;language&#xff0c;subject内容写入表格中&#xff0c;其中opf之一如上&#xff0c;表头对应为&#xff1a;标题&#xf…

豆包大模型升级:日均Tokens使用量破5000亿,字节跳动打造即刻体验的《Her》式AI

ChatGPT 发布近两年后&#xff0c;全球掀起了一场大模型竞赛&#xff0c;如今怎么将大模型落地&#xff0c;成为萦绕在每一家 AI 公司的最大命题。 最近有媒体统计&#xff0c;自从 GPT-3.5 上线以来&#xff0c;中国新成立的 AI 公司已经有近 8 万家陷入注销、吊销或停业异常…

【前端】vue数据监测原理

问题展示&#xff1a; 点击按钮之后&#xff0c;vue中的persons数据改变&#xff0c;但是页面显示的内容没变。&#xff08;先点击按钮再打开vue的数据面板可以看见改变&#xff0c;先打开后点击数据面板也不能显示改变。&#xff09; 此时的更新代码&#xff1a; methods:{…

AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)

前言 国产3A大作《黑神话&#xff1a;悟空》一经发布&#xff0c;瞬间登顶steam榜首&#xff0c;打破单机游戏在线记录&#xff0c;全球几十万国外玩家听着中文配音&#xff0c;看着翻译过来的英文字幕&#xff0c;玩的不亦乐乎&#xff01; 甚至国外论坛上兴起了一股西游风&a…

eBest AI 大模型:智能化引领快消新未来

在快消品行业的高速变化中&#xff0c;数据与知识的管理、分析和应用变得至关重要。面对着日益增长的市场需求和顾客个性化的体验期望&#xff0c;如何利用技术提升效率、增强客户互动和优化销售策略&#xff1f;eBest GPT Hub&#xff0c;一个专为快消行业打造的AI大模型平台&…

第二节:Nodify 添加节点到编辑器中

引言 上节说到Nodify有三层结构&#xff0c;编辑器Editor&#xff0c;节点Node和连接组件Connection&#xff0c;下面就让我们来进行第一步尝试&#xff0c;在编辑器中添加一个节点。 在窗口中添加nodify命名空间&#xff0c;并添加控件。 xmlns:nodify"https://miroiu.…

docker 多线成服务,比如gunicorn服务启动报错解决办法

docker执行的时候报错&#xff0c;排查是线程创建权限不足导致的&#xff0c;报错如下。 解决办法 docker run -e OPENBLAS_NUM_THREADS1 your_image

淘宝商品评论API:评价内容中的关键词搜索与筛选

淘宝商品评论API为开发者提供了强大的工具&#xff0c;用于获取淘宝商品的评论信息&#xff0c;包括评价内容、评论评分、评论时间等。在评价内容中进行关键词搜索与筛选&#xff0c;是电商数据分析、用户行为研究以及商品质量监控等场景下的重要需求。以下是对这一过程的详细解…

EasyCVR视频汇聚平台革新播放体验:WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新&#xff0c;视频监控已经广泛应用于社会各个领域&#xff0c;成为现代安全管理的重要组成部分。在视频监控领域&#xff0c;视频编码技术的选择尤为重要&#xff0c;它不仅关系到视频的质量&#xff0c;还直接影响到视频的传输效率和兼…

智领云开源KDP:深度剖析其与主流数据平台的性能与特性对比

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。本文将重点分析智领云开源KDP与其他数据平台的比较&#xff0c;探讨其在大数据…

[000-01-022].第03节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建&#xff1a; 1.1.搭建RabbitMQ单体架构&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令(分别按照以下顺序安装…