蓝桥杯 最长公共子序列

给定俩个字符串,S1S2.....Sn和T1T2......Tn。求出这俩个字符串中最长的公共子序列的长度。字符串S1S2......Sn的子序列指可以表示Si1Si2.......Sim的序列

/* 
*最长公共子序列 ,输入俩个序列之后不断检查是否有相同出现
*如果发现字符相同,则在动态记录数组中加 1
*如果数组不相同,则选择记录 a数组减 1最大,或者选择 b数组子序列 减 1最大 
* 
*/ 
#include<stdio.h>
#include<string.h>
int N,M;
int dp[100][100];
char a[100],b[100];
int max(int n,int m){
return n>m?n:m;
}
void f(){
for(int i=0;i<N;i++)
for(int j=0;j<M;j++){
if(a[i]==b[j])    dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); 
}
printf("%d",dp[N][M]);
}
int main(){
memset(dp,0,sizeof(dp));
scanf("%d%d",&N,&M);
getchar();
for(int i=0;i<N;i++)
scanf("%c",&a[i]);
getchar();
for(int j=0;j<N;j++){
scanf("%c",&b[j]);
}
f();
return 0;
}

 

/***************************************************/

#include<stdio.h>
#include<string.h>
int N,M;
int dp[100][100];
char a[100],b[100];
int max(int n,int m){
return n>m?n:m;
}
int rec(int i,int j){
if(dp[i][j]>=0) return dp[i][j];
int res=0;
if(i==N || j==M)
return 0;    
else if(a[i]==b[j]) res=rec(i+1,j+1)+1;  //向后寻找并且 res+1
else
res=max(rec(i+1,j),rec(i,j+1));        //背包的核心 ,前面的最大倒推回来之后一定是当前的最大
return dp[i][j]=res;
}
int main(){
memset(dp,-1,sizeof(dp));
scanf("%d%d",&N,&M);
getchar();
scanf("%s",a);
getchar();
scanf("%s",b);
printf("%d
",rec(0,0));
return 0;
}
原文地址:https://www.cnblogs.com/sky-z/p/4411043.html