蓝桥杯 最长公共子序列
给定俩个字符串,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\n",rec(0,0)); return 0; }