最长共公子序列(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) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
随机推荐
- 洛谷P5119 Convent 题解
题目 很好想的一道二分题,首先,二分一定满足单调性,而题目中非常明显的就是用的车越多,所用时间越少,所以可以枚举时间,判断是否可以比\(m\)少. 然后在二分时,更是要注意下标的一些问题,也要注意车和 ...
- ubuntu配置ssh连接方式
pgadmin4 配置界面的password指的是数据库用户的密码, 不是服务器的密码. pg数据库 1.确保远程服务器开放相应端口.这个是在防火墙设置. 2.pg数据库服务器允许外部ip访问, 默认 ...
- python并发编程之协程知识点
由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ...
- VBScript 学习笔记
创建一个变量 VBScript 变量名称的规则: 必须以字母开头 不能包含点号(.) 不能超过 255 个字符 在 VBScript 的缩写中,所有的变量都与类型 variant 相关,可存储不同类型 ...
- laravel带参数分页
<!---分页--> <div id="pagination-box"> {{ $list->appends(['mobile'=>$mobil ...
- Kafka分区分配策略(Partition Assignment Strategy
问题 用过 Kafka 的同学用过都知道,每个 Topic 一般会有很多个 partitions.为了使得我们能够及时消费消息,我们也可能会启动多个 Consumer 去消费,而每个 Consumer ...
- BZOJ2287 消失之物
这题貌似是个权限题qwq,我是用离线题库+本地数据包测的 题目大意: 给你\(n\)个体积分别为\(w[i]\)的物品和容积\(m\),问你将每一件物品分别去掉之后,拼出\(1\)~\(m\)中每一个 ...
- 十行代码分清Java 的 || 和 &&
发现有些同学到现在还没分不清 || 和 &&的作用 package System; /** * * @ClassName: RandomTest * @Description: 十行代 ...
- Java基础--面向对象编程3(继承)
1.继承的作用 为了提取两个类中公共的代码,可以使用继承抽取重复性的代码到一个公共类中. 这个公共的类称为父类(super class),继承于父类的类称为子类(sub class). 2.java继 ...
- (八) Usb摄像头描述符解析
目录 Usb摄像头描述符解析 总结 参考资料 打印设备描述符 打印配置描述符 打印接口联合体描述符 打印接口描述符 打印当前设置的额外描述符 代码解析额外的描述符 打印端点描述符 title: Usb ...