最长公共子序列LCS
输入: str1 = “abcde”, str2 = “ace”
输出: 3
解释: 最长公共子序列是 “ace”,它的长度是 3
这里用0表示空串,在代码里用-1表示空串
一定要注意,调用函数,不要直接调用数组值
递归写法::
#include<bits/stdc++.h>
using namespace std;
int recdp[1000][1000]= {0};
char str1[5]= {'a','b','c','d','e'};
char str2[3]= {'a','c','e'};
int dp(int i,int j)
{if(i==-1||j==-1){return 0;///两个空串}if(recdp[i][j]){return recdp[i][j];}if(str1[i]==str2[j]){///recdp[i][j]=recdp[i-1][j-1]+1;这句写错了 ,一定不要乱调用recdp[i][j]=dp(i-1,j-1)+1;return recdp[i][j];}else{recdp[i][j]=max(dp(i-1,j),max(dp(i-1,j-1),dp(i,j-1)));///三个中取最大,但实时上不用,具体解是看电子书return recdp[i][j];}
}
int main()
{//cout << "Hello world!" << endl;cout<<dp(5,2);return 0;
}
2020.9.12复习,发现了之前代码的问题-输入应该是5-1,3-1
并写了一个以0为空字符串的(边界的)
1.当这里直接使用图中的0为空字符串时,一定记得,str也是从0开始计算的,所以第五个字符应该是str[4]
2.不同时直接选大的(我也不知道谁大,那就比比吧)(可能,要1,可能要2,****可能都不要)
3.不需要两个都不要,两个都不要的话,第一次不要1,第二次不要2就行了,而且也不会,因为两个都不要一定是最小的
#include<bits/stdc++.h>
using namespace std;
int recdp[1000][1000]= {0};
char str1[5]= {'a','b','c','d','e'};
char str2[3]= {'a','c','e'};
int dp(int i,int j)
{///让数组头从开始,dp0,与dp,0都代表空串///baseif(i==0||j==0)return 0;///recif(recdp[i][j]!=0){return recdp[i][j];}///相同时直接+1/// 当这里直接使用图中的0为空字符串时,一定记得,str也是从0开始计算的,所以第五个字符应该是str[4]//if(str1[i-1]==str2[j-1]){recdp[i][j]=dp(i-1,j-1)+1;return recdp[i][j];}else{///不同时直接选大的(我也不知道谁大,那就比比吧)(可能,要1,可能要2,****可能都不要)
///不需要两个都不要,两个都不要的话,第一次不要1,第二次不要2就行了,而且也不会,因为两个都不要一定是最小的
///*******不同时不要+1recdp[i][j]=max(dp(i-1,j),dp(i,j-1));return recdp[i][j];}return 0;
}
int main()
{//cout << "Hello world!" << endl;cout<<dp(5,3);return 0;
}
递推写法略有不同,str[i-1]==str[j-1] 而且一定要有空串为0
#include<bits/stdc++.h>
using namespace std;
int recdp[1000][1000]= {0};
char str1[5]= {'a','b','c','d','e'};
char str2[3]= {'a','c','e'};
int main()
{int strlen1=5,strlen2=3;for(int i=1;i<=strlen1+1;i++){for(int j=1;j<=strlen2+1;j++){if(str1[i-1]==str2[j-1]){///注意这里recdp[i][j]=recdp[i-1][j-1]+1;}else{recdp[i][j]=max(recdp[i-1][j],recdp[i][j-1]);}}}for(int i=0;i<=strlen1;i++){for(int j=0;j<=strlen2;j++){cout<<recdp[i][j]<<" ";}cout<<endl;}return 0;
}
最长公共子序列LCS相关推荐
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 动态规划之最长公共子序列(LCS)
最长公共子序列(LCS,Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最 ...
- 程序员编程艺术第十一章:最长公共子序列(LCS)问题
程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...
- 算法之最长公共子序列(LCS)问题
算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...
- 最长公共子序列php,动态规划(最长公共子序列LCS)
概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...
- python实现求解最长公共子序列LCS问题
在实现论文<Automatically Generating Models for Botnet Detection>论文的算法中,用到了一个The longest commom subs ...
- 算法导论-----最长公共子序列LCS(动态规划)
目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理 1. 子序列(subsequence): 一个 ...
- 动态规划表格法解决最长公共子序列(LCS)问题
3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...
- 最长公共子序列 (LCS) 详解+例题模板(全)
欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- ------------ ...
- 相似度:最长公共子序列--LCS
一.概念 1.子序列 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序).如序列[A,B,C,B,D,A,B]的子序列有:[A,B],[B,C,A],[A,D, ...
最新文章
- java兔子_JAVA经典兔子问题
- eclipse打包项目为aar_Eclipse中使用AAR
- 中学生学计算机6,中小学学习电脑版
- html怎么建立段落,HTML 段落
- java 图片有损压缩_java - 用有损jpeg压缩多页tiff图像 - 堆栈内存溢出
- Spring Boot 启动流程
- 《Cocos2d-JS开发之旅》重印在即,感谢大家的支持
- oracle 数据分列,如何使用Excel把有规律地txt文本数据分列
- 【Ubuntu版】CMake安装教程
- 向Richedit插入动态Gif的实现(关于QQ表情功能的制作)
- 微信公众号禁止分享功能
- 机器学习案例(三):未来销售预测
- Beamer 使用笔记
- Codeforces Round 63 (Rated for Div. 2) F. Delivery Oligopoly dp+图论状态转移
- Nodejs报内部错误 TypeError: Cannot read property ‘destroy‘ of undefined的解决方法
- 计算机按哪里有音乐键,电脑键盘声音键是哪个 怎么打开电脑键盘声音键 - 驱动管家...
- 安徽省软考报名时间成绩查询安徽省教育考试院安徽省人事考试网报名入口
- c语言程序2000行代码,C语言教务管理系统2000行代码
- 竖屏图片滚动html5,详解swipe使用及竖屏页面滚动方法
- SQL语法之分组函数,分组查询(进阶5)and连接查询(sql92语法进阶6)