#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; char a[100]; char b[100]; int dp[10][10]; int max(int a,int b) { if(a>b) return a; else return b; } int lcs(char a[],char b[],int m,int n) //备忘录法 { if(dp[m][n]!=-1) return dp[m][n]; if(a[m]==b[n]) dp[m][n]=lcs(a,b,m-1,n-1)+1; else dp[m][n]= max(lcs(a,b,m-1,n),lcs(a,b,m,n-1)); if(m==0||n==0) return dp[m][n]=0; return dp[m][n]; } int lcs1(char a[],char b[],int dp[10][10]) //动态规划法 { int ma= strlen(a+1); int mb= strlen(b+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=ma;i++){ for(int j=1;j<=mb;j++){ if(a[i]==b[j]){ dp[i][j]=dp[i-1][j-1]+1; } else{ if(dp[i-1][j]>=dp[i][j-1]) dp[i][j]=dp[i-1][j]; else dp[i][j]=dp[i][j-1]; } } } return dp[ma][mb]; } int main() { cin>>a+1>>b+1; cout<<a+1<<" "<<b+1<<endl; int s=lcs1(a,b,dp); printf("这个矩阵是%d*%d \n",strlen(a+1),strlen(b+1)); for(int i=1;i<=strlen(a+1);i++) dp[i][0]=a[i]; for(int i=1;i<=strlen(b+1);i++) dp[0][i]=b[i]; for(int i=0;i<=strlen(a+1);i++){ for(int j=0;j<=strlen(b+1);j++) { if(i==0||j==0) printf("%c ",dp[i][j]); else printf("%d ",dp[i][j]); } printf("\n"); } printf("max=%d\n",s); return 0; }
LCS - 最长公共子序列
猜你喜欢
转载自blog.csdn.net/hujinhong145/article/details/80034494
今日推荐
周排行