最长共公子序列(LCS)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
char str1[], str2[];
int f[][];//记录状态
//动态规划是一种记忆化搜索
/*有俩个字符串,求出他们的最长公共子序列
,例如:
acdtfs
aldtks
最长公共子序列是adts,长度为4
n,m
string1(length = n)
string2(length = m)
f[i][j]表示1串第i个与第二个串第j个匹配得到
的子序列最大长度
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
f[i - 1][j - 1] + 1;
*/
int main(){
int i, j, k;
int n, m;
scanf("%d%d",&n,&m);
scanf("%s%s",str1 + , str2 + );
f[][] = ;
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
if(str1[i] == str2[j]){
f[i][j] = f[i - ][j - ] + ;
}
f[i][j]=max(f[i][j], f[i-][j]);
f[i][j]=max(f[i][j], f[i][j-]);
}
}
printf("%d\n", f[n][m]);
return ;
}
#include <iostream>
using namespace std;
/*有一串数,求出它的最大不下降子序列的
长度(等于也包括)
如1, 2, 5, 3, 6, 2, 9, 10
答案是
1 2 3 6 9 10(这只是其中之一)
f[i]表示子序列包括数字i的时候,最长不下降子序列的长度
f[i] = max(f[j] + 1) a[i] > a[j];
ans = max(f[i])
*/
int a[];
int f[];
int memory[];//记录状态
int main(){
int i, j, k;
int n;
scanf("%d", &n);//数串的长度
for(i = ; i <= n; i++){
scanf("%d", &a[i]);
}
int temp;
f[] = ;//第一个为1
for(i = ; i <= n; i++){
f[i] = ;
for(j = ; j <= i - ; j++){
if(a[i] > a[j]){//如果后面的数字更大
if(f[i] < f[j] + ){//如果后面数字的最长子序列长度小于前面最长子序列长度 + 1
f[i] = f[j] + ;//更新此时的最长子序列长度
memory[i] = j;//记录i位置的前一个位置
}
}
}
}
int ans = , mark;//mark用来取得记录最大不下降子序列的下标,ans用来记录大子序列的值
for(i = ; i <= n; i++){
if(ans < f[i]){
mark = i;
ans = f[i];
}
}
temp = mark;
//倒序输出记录状态 (这里可以利用一个栈顺序输出)
while(temp > ){
printf("%d ", a[temp]);
temp = memory[temp];
}
printf("\n%d\n", ans);
return ;
}
最长公共子序列的优秀博文:https://blog.csdn.net/someone_and_anyone/article/details/81044153
最长共公子序列(LCS)的更多相关文章
- [vijosP1303]导弹拦截(最长上升子序列转LCS)
描述 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭 ...
- 动态规划法(十)最长公共子序列(LCS)问题
问题介绍 给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...
- python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)
问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...
- [CTSC2017]最长上升自序列(伪题解)(Dilworth's theorem+网络流)
部分分做法很多,但每想出来一个也就多5-10分.正解还不会,下面是各种部分分做法: Subtask 1:k=1 LCS长度最长为1,也就是说不存在j>i和a[j]>a[i]同时成立.显然就 ...
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
一.Description A palindrome is a symmetrical string, that is, a string read identically from left to ...
- 算法复习——求最长不下降序列长度(dp算法)
题目: 题目背景 161114-练习-DAY1-AHSDFZ T2 题目描述 有 N 辆列车,标记为 1,2,3,…,N.它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则.列车进入 ...
- 【Luogu P1439】最长公共子序列(LCS)
Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...
- 程序员的算法课(6)-最长公共子序列(LCS)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
随机推荐
- WC2019游记
本来不打算写游记的,但后来想了想这么一次难忘的经历总该留下点痕迹吧...... DAY-1 走之前的最后一天,因为前一天晚上打了CF,所以早上9点才到机房.写了一道圆方树深深地体会到了来自仙人掌的恶意 ...
- 改善python程序的建议[转]
<编写高质量代码 改善Python程序的91个建议> <编写高质量代码 改善Python程序的91个建议>读后程序学习小结 - BigDeng_2014的专栏 - CSDN博客 ...
- MySQ数据备份
MySQL备份概述 问题:备份和冗余有什么区别? 备份:能够防止由于机械故障以及人为操作带来的数据丢失,例如将数据库文件保存在了其它地方. 冗余:数据有多份冗余,但不等于备份,只能防止机械故障带来的数 ...
- GetFontResourceInfo 函数: 获取字体文件对应的字体名
在 win 7, gdi32.dll,找不到 GetFontResourceInfo(), 但能找到 GetFontResourceInfoW(), 用法类似. //----------------- ...
- python学习笔记之元祖
#元祖 只读列表,可循环查询,可切片.#儿子不能改,孙子可能可以改. tu = (1,2,3,'alex',[2,3,4,'taibai'],'egon') print(tu[3]) print(tu ...
- 07--STL序列容器(Array)
一:Array了解 array<T,N> 模板定义了一种相当于标准数组的容器类型.它是一个有 N 个 T 类型元素的固定序列.除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别. ...
- i-83.net quadhost子产品
i-83.net 6$一年, 首年半价, 优惠码: APR19-NAT50 加拿大 ---------------------------------------------------------- ...
- PMP知识点(四)——项目管理计划的内容
项目管理计划([4.2制定项目管理计划]的输出) 包含三个基准和十三个子计划和一些其他内容 三个基准:成本基本.进度基准.范围基准 其中范围基准([5.4创建WBS]的输出)包含了:项目范围说明书.W ...
- 【7】学习C++之类的构造函数
(说实话,我一开始真没觉得构造函数这块有多重要,但是看的视频中老师却花了不少的时间去讲这块内容,本着整理了不亏的心态还是整理了一下) 1.常见的构造函数 C++的类在创建对象的时候,都会去调用构造函数 ...
- Python django解决跨域请求的问题
解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ . ...