DP经典例题——LIS&LCS
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;
}
LIS
最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。
《算法竞赛进阶指南》上依旧没有给出标程怎么会要标程呢所以给出程序或许并非最佳
状态表示:f[i,j]表示前缀子串a[1-i]与b[1-j]的“最长公共子序列”的长度
状态划分:已处理的前缀长度
转移方程:
\[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;
}
DP经典例题——LIS&LCS的更多相关文章
- 线性DP总结(LIS,LCS,LCIS,最长子段和)
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...
- dp入门(LIS,LCS)
LCS
- hdu1693 Eat the Trees [插头DP经典例题]
想当初,我听见大佬们谈起插头DP时,觉得插头DP是个神仙的东西. 某大佬:"考场见到插头DP,直接弃疗." 现在,我终于懂了他们为什么这么说了. 因为-- 插头DP很毒瘤! 为什么 ...
- [NOI2001] 炮兵阵地 (状压Dp经典例题)
如果您的电脑比较优秀能在 1sec 内跑过 2^1000 的时间复杂度,不妨你可以尝试一下,其实实际时间复杂度远远少于 2^1000,作为骗分不错的选择QAQ,然后我们来分析一下正解: 很显然此题是一 ...
- 石子合并(区间DP经典例题)
题目链接:https://www.luogu.org/problemnew/show/P1880 #include <cstdio> #include <cmath> #inc ...
- 到底什么是dp思想(内含大量经典例题,附带详细解析)
期末了,通过写博客的方式复习一下dp,把自己理解的dp思想通过样例全部说出来 说说我所理解的dp思想 dp一般用于解决多阶段决策问题,即每个阶段都要做一个决策,全部的决策是一个决策序列,要你求一个 最 ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- C语言经典例题100
C语言经典例题100 来源 http://www.fishc.com 适合初学者 ----------------------------------------------------------- ...
- C语言中的经典例题用javascript怎么解?(一)
C语言中的经典例题用javascript怎么解?(一) 一.1+2+3+……+100=? <script type="text/javascript"> ...
- 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】
首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...
随机推荐
- CentOS 7 下安装 MySQL 8.x
CentOS 7 下安装 MySQL 8.x 作者:Grey 原文地址: 博客园:CentOS 7 下安装 MySQL 8.x CSDN:CentOS 7 下安装 MySQL 8.x 环境 CentO ...
- CF600E Lomsat gelral (线段树合并)
相当于是线段树合并的模板题,比(雨天的尾巴)还要板. 唯一注意的是线段树的更新,因为同一子树中可能有多种颜色占主导地位,要输出编号和,比如一颗子树中,1出现3次(最多),3出现3次,那么应该输出4. ...
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
这一章我们来唠唠如何优化BERT对文本长度的限制.BERT使用的Transformer结构核心在于注意力机制强大的交互和记忆能力.不过Attention本身O(n^2)的计算和内存复杂度,也限制了Tr ...
- Kafka与Flume之集成比较
Kafka与Flume之集成比较 一.Kafka与Flume比较 在企业中必须要清楚流式数据采集框架flume和kafka的定位是什么:flume:cloudera公司研发: 适合多个生产者: 适合下 ...
- String 定义一个字符串
String 定义一个字符串,要用双引号,多个字符串用+号连接 String S = "sjosajojoaf"; System.out.println(S);
- SQL 报表制作和整形
本文章主要介绍制作报表的查询,这些查询通常需要考虑与报表相关的格式设置,还需使用多级聚合. 1.将结果集转置为一行(行转列) 将多行中的值转换为单行中的列. 情景:有一个员工表,统计出一个结果集,显示 ...
- Python学习之实例2
一.根据输入的各科成绩统计学生成绩是否达标 1 (背景:输入学生数量,以及各个学生语文.数学.英语.历史四科的成绩,如果总成绩小于 240,则成绩不达标,否则成绩合格) 2 3 #coding=utf ...
- OpenCvSharp的安装和使用
OpencvSharp是opencv的C#版本,使用习惯了opencv的人学起OpenCvSharp会很容易上手,看了网上很多的安装方式,最后我感觉还是自己去下载安装包的方式最简单,通过Nuget的方 ...
- C#一个16进制数用二进制数表示是几位?
1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255.一位16进制数(用二进制表示是xxxx) 最多只表示到15(即对应16进制的F),要表示到255 ...
- 09 | 从容器到容器云:谈谈Kubernetes的本质
你好,我是张磊.今天我和你分享的主题是:从容器到容器云,谈谈Kubernetes的本质. 在前面的四篇文章中,我以Docker项目为例,一步步剖析了Linux容器的具体实现方式.通过这些讲解你应该能够 ...