LIS、LCS算法模型

文章目录

  • 1.LCS算法模型
  • 2.LIS算法模型

1.LCS算法模型

LCS问题就是给定两个序列A和B,求他们最长的公共子序列。
在求解时,我们会设dp[i][j]表示为A[1 ~ i]序列和B[1 ~ j]序列中(不规定结尾)的最长子序列的长度。

if(a[i]==b[i]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

就是说,当a[i]=b[j]时,可以将他们作为插入到LCS的后面,长度加1即可;当a[i]!=b[j]时,说明此时LCS不会演唱,那么就要从dp[i-1][j]和dp[i][j-1]中取大的作为最长的长度。

例题:
在这里插入图片描述
示例代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e3+5;
int n,m;
ll a[N],b[N],dp[N][N];
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int j=1;j<=m;j++)cin>>b[j];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}cout<<dp[n][m];return 0;
}

如何求出具体的最长子序列?

	vector<int> v;int x=n,y=m;// 只需要从dp[n][m]向前搜索即可,如果相等则回到左上方,否则回到max(上边,左边)while(x&&y){if(a[x]==b[y]){v.push_back(a[x]);x--,y--;//左上走 }else if(dp[x-1][y]>dp[x][y-1])x--;//向大的走else y--; }reverse(v.begin(),v.end());for(const auto &i:v)cout<<i<<' ';

2.LIS算法模型

最长上升子序列是一个经典的DP模型。
子序列指的是一个序列中,按照原顺序选出若干个不一定连续的元素所组成的序列。
在求解LIS时,一般我们会设dp[i]表示1~i序列中以a[i]结尾的最长上升子序列的长度。
状态转移方程为:dp[i] = max(dp[j] + 1),if a[i] > a[j]
表示a[i]要插入到不同的子序列后面的情况。

模板例题:

在这里插入图片描述
示例代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+5;
int a[N],dp[N];
// 设状态 dp[i]表示1~i的最长上升子序列的长度,状态转移方程为 dp[i]=max(dp[j]+1) if a[i]>a[j] 
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){dp[i]=1;for(int j=1;j<i;j++){if(a[i]>a[j])dp[i]=max(dp[i],dp[j]+1);}}int ans=0;for(int i=1;i<=n;i++){ans=max(ans,dp[i]);}cout<<ans;return 0;
}

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

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

相关文章

MFC标签设计工具 图片控件上,移动鼠标显示图片控件内的鼠标xy的水平和垂直辅助线要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 源码

需求&#xff1a;要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 我生成标签时&#xff0c;需要对齐和 调文字字体大小。这工具微调 能快速知道位置 和字体大小。 标签设计(点击图片&#xff0c;上下左右箭头移动 或-调字体) 已经够用了&#xff0c;滚动条还没完…

静态代理,jdk动态代理,cglib动态代理

文章目录 静态代理动态代理jdk动态代理JDK生成的动态代理类大概源码cglib动态代理 代理模式就是用代理对象代替真实对象去完成相应的操作&#xff0c;并且能够在操作执行的前后对操作进行增强处理。 静态代理 mybatis使用的就是静态代理&#xff0c;相比动态代理&#xff0c;…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

STL的基本概念

一、STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升 面向对象的三大特性(简单理解) 封装&#xff1a;把属性和行为抽象出来作为一个整体来实现事和物 继承&#xff1a;子类继承父类&a…

Gui guider使用自定义字体总结

在实际开发中&#xff0c;我们通常是使用自定义字体。 在 LVGL 中&#xff0c;用户需要使用自定义的字库&#xff0c;其实现方法可分为两类&#xff1a; ① 通过 C 语言数组&#xff08;内部读取&#xff09;&#xff1b; ② 通过文件系统读取字库&#xff08;外部读取&#…

【CAD建模号小技巧】边缘尖角光滑处理方法

教大家一个处理模型边缘的方法&#xff0c;处理后模型更美观&#xff0c;更不易坏&#xff0c;而且有些零件还必须经过这样的处理。 咱们看一个未经过边缘处理的模型&#xff0c;边缘是尖的&#xff0c;摸到会刺伤&#xff0c;一些接近刀口形状。 更危险了&#xff0c;所以要进…

javascript基础代码练习

一、输入新增病例数&#xff0c;累计确诊病例数&#xff0c;14天内聚集性疫情发生天数。新增或者累计确诊病例为0则该地区为低风险地区。新增大于0且累计确诊&#xff1c;50或者累计大于50且14天内聚集性疫情发生天数为0的地区为中风险地区。其他情况为高风险地区。 <!DOCT…

大数据开发(离线实时音乐数仓)

大数据开发&#xff08;离线实时音乐数仓&#xff09; 一、数据库与ER建模1、数据库三范式2、ER实体关系模型 二、数据仓库与维度建模1、数据仓库&#xff08;Data Warehouse、DW、DWH&#xff09;1、关系型数据库很难将这些数据转换成企业真正需要的决策信息&#xff0c;原因如…

C语言程序练习——汉诺塔递归

1. 题目 在终端输入汉诺塔层数n&#xff0c;实现将n层汉诺塔通过三座塔座A、B、C进行排列 2. 代码 #include <stdio.h>int hannuota(int len, int str, int tmp, int dst) {if (1 len){printf("%c -> %c\n", str, dst);}else{hannuota(len-1, str, dst, …

Python更改Word文档的页面大小

页面大小确定文档中每个页面的尺寸和布局。在某些情况下&#xff0c;您可能需要自定义页面大小以满足特定要求。在这种情况下&#xff0c;Python可以帮助您。通过利用Python&#xff0c;您可以自动化更改Word文档中页面大小的过程&#xff0c;节省时间和精力。本文将介绍如何使…

Python---Numpy学习

首先&#xff0c;先来认识一下Numpy数组对象&#xff0c;以及如何创建它 import numpy as np# 1.认识数组对象 # 指定取值范围和跨度创建数组对象 # 创建一个3行4列的数组 data np.arange(12).reshape(3, 4)print(data)print(type(data))# 维度 print(data.shape)# 维度的个数…

【Java程序设计】【C00364】基于Springboot的美发管理系统(有论文)

基于Springboot的美发管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…