首页 > 其他分享 >DP经典例题——LIS&LCS

DP经典例题——LIS&LCS

时间:2022-11-22 23:45:32浏览次数:70  
标签:LCS int LIS 序列 例题 最长 dp

DP经典例题——LIS&LCS

LCS

最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的.

《算法竞赛进阶指南》上没有给出标程怎么会要标程呢所以给出程序或许并非最佳

  • 状态表示:f[i]表示以a[i]为结尾的“最长上升子序列”的长度

  • 阶段划分:子序列的结尾位置

  • 转移方程

    \[f[i]=max(f[j]+1),0<=j<i,a[j]<a[i] \]

  • 边界:f[0]=0

模板代码

//最长公共子序列
#include<bits/stdc++.h>
using namespace std;
char a[100000],b[100000];
int dp[10000][10000],n;	//dp为转移数组
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	cin>>a[i];
	for(int i=1;i<=n;i++)	cin>>b[i];
	dp[n][0]=0,dp[0][n]=0;	//初始化
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dp[i][j]=max(dp[i-1][j],dp[i][j-1]);	//状态转移方程
			if(a[i]==b[j])	dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
		}
	}
	printf("%d",dp[n][n]);
	return 0;
}

例题:P1439 【模板】最长公共子序列

LIS

最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。

《算法竞赛进阶指南》上依旧没有给出标程怎么会要标程呢所以给出程序或许并非最佳

  • 状态表示:f[i,j]表示前缀子串a[1i]与b[1j]的“最长公共子序列”的长度

  • 状态划分:已处理的前缀长度

  • 转移方程

    \[f[i,j]=max(max(f[i-1,j],f[i,j-1]),f[i-1,j-1])\\ if(a[i]==b[i]) \]

  • 边界:f[i,0]=f[0,j]=0

模板代码

//最长上升子序列
#include<bits/stdc++.h>
using namespace std;
int a[100000],n,dp[100000],ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	dp[0]=0;	//初始化
	for(int i=1;i<=n;i++){
		for(int j=0;j<i;j++){
			if(a[j]<a[i])	dp[i]=max(dp[i],dp[j]+1);	//状态转移
		}
	}
	for(int i=1;i<=n;i++)	ans=max(ans,dp[i]);
	printf("%d",ans);
	return 0;
}

标签:LCS,int,LIS,序列,例题,最长,dp
From: https://www.cnblogs.com/Nebulary/p/16916916.html

相关文章

  • C# WPF ListBox 最后追加项自动滚动到最后一项 ScrollIntoView
    用这个:lstbDynamicNote.ScrollIntoView(lstbDynamicNote.Items[lstbDynamicNote.Items.Count-1]);privatevoidDynamicNoteShow(stringdynamicNote){if(lstb......
  • 1、ArrayList源码解析
    目录1概述2底层数据结构3构造函数4自动扩容5set()get()remove()6Fail-Fast机制1概述ArrayList实现了List接口,是顺序容器,允许放入null元素有一个容量(capacit......
  • 说一下 ArrayList 和 LinkedList 的区别?
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。前言大家好,我是小彭。在上一篇文章里,我们聊到了基于动态数组ArrayList线性表,今天我们来讨......
  • net中winform教程 ListView控件如何实现分组?
    虽然现在winform开发很少使用微软自带的控件,但其中有一个控件还是不错的,它就是ListView控件。操作系统的文件夹页,就是ListView控件的样子,数据展示包括大图标、小图标、列表......
  • yaml list和Dictionary(7)
    list列表列表由多个元素组成,每个元素放在不同行,且元素前均使用“-”打头,或者将所有元素用[]括起来放在同一行范例:#Alistoftastyfruits-Apple-Orange-S......
  • maven-publish 使用发布 andorid aar 到本地仓,项目仓或module 仓
    applyplugin:'maven-publish'println"<------${project.name}mountmavenpush-------->"/*切勿定义:groupId,artifactId,version作为变量否则导致自定义publishing......
  • ListView中getView的原理+如何在ListView中放置多个item
    一.ListView和Adapter的基础工作原理:ListView针对List中每个item,要求adapter“给我一个视图”(getView)。一个新的视图被返回并显示如果我们有上亿个项目要显示......
  • wpf ListBox循环显示颜色选择框
     数据源list,设置ListBoxItem实现<Page.Resources><StyleTargetType="ListBoxItem"><SetterProperty="Template"><Setter......
  • [Android开发学iOS系列] TableView展现一个list
    TableView基础本文讲讲TableView的基本使用.顺便介绍一下delegation.TableView用来做什么TableView用来展示一个很长的list.和Android中的RecyclerView不同,iOS中的......
  • CF1747E List Generation
    考虑将问题抽象成:左上角为\((0,0)\)右下角为\((n,m)\)的网格图,求所有满足至少有一条只向下或向右走的路径经过点集内所有点的的不同的点集大小之和。那么显然拐点有......