- P1051 最长公共子序列
- P1052 最长公共字串
- P3636 三个序列的最长公共子序列
f[i][j]表示一号序列的第 i 位和二号序列的第 j 位
把两个字序列/字串一位一位去比较,若出现相同的一位则 f[i][j]在f[i-1][j-1] 的基础上长度+1,否则取前面长度的最大值,长度不变;
模板题,很简单;
- #include
- using namespace std;
- int n,m;
- int a[505],b[505];
- int f[505][505];
- int main(){
- cin>>n>>m;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- }
- for(int i=1;i<=m;i++){
- cin>>b[i];
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- if(a[i]==b[j]){
- f[i][j]=f[i-1][j-1]+1;
- }else{
- f[i][j]=max(f[i-1][j],f[i][j-1]);
- }
- }
- }
- cout<
- return 0;
- }
P1052 最长公共字串
注意字串要求连续,所以f[i][j]在 a串与b串不连续时取0这个值,ans为f数组中的最大值;
- #include
- using namespace std;
- int n,m,ans=0;
- int a[505],b[505];
- int f[505][505];
- int main(){
- cin>>n>>m;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- }
- for(int i=1;i<=m;i++){
- cin>>b[i];
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- f[i][j]=0;
- if(a[i]==b[j]){
- f[i][j]=f[i-1][j-1]+1;
- }
- ans=max(ans,f[i][j]);
- }
- }
- cout<
- return 0;
- }
P3636 三个序列的最长公共子序列
直接开个三维数组,按照模板扩充出第三位的判断即可;
- #include
- using namespace std;
- int x,y,z;
- int a[505],b[505],c[205];
- int f[205][205][205];
- int main(){
- cin>>x>>y>>z;
- for(int i=1;i<=x;i++){
- cin>>a[i];
- }
- for(int i=1;i<=y;i++){
- cin>>b[i];
- }
- for(int i=1;i<=z;i++){
- cin>>c[i];
- }
- for(int i=1;i<=x;i++){
- for(int j=1;j<=y;j++){
- for(int k=1;k<=z;k++){
- f[i][j][k]=0;
- if(a[i]==b[j]&&b[j]==c[k]){
- f[i][j][k]=f[i-1][j-1][k-1]+1;
- }else{
- f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);
- f[i][j][k]=max(f[i][j][k],f[i][j][k-1]);
- }
- }
- }
- }
- cout<
- return 0;
- }
看到这里了,给个三连不过分吧;
-
相关阅读:
request对象对请求体,请求头参数的解析
分布式websocket搭建方案
【UML分析、建模与设计】我在工作时遇到UML
前后端验证码交互完整流程
C#中解决PC端程序多开的问题
Java-枚举
为什么说Redis是单线程的以及Redis为什么这么快!
js进阶笔记之原型,原型链
【Redis】基于Spring Cache + Redis + Jackson的注解式自动缓存方案保姆式教程(2022最新)
怎么压缩ppt大小?快速压缩ppt文件
-
原文地址:https://blog.csdn.net/Kochakin/article/details/126202338