最长公共子序列+元素打印

来源:互联网 发布:windows api大全 编辑:程序博客网 时间:2024/05/18 05:07

代码:

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 100+10;char a[maxn],b[maxn];int dp[maxn][maxn];int path[maxn][maxn];void print(int len1 , int len2){if(len1 < 0 || len2 < 0) return ;if(path[len1][len2] == 1){print(len1-1,len2-1);printf("%c",a[len1]);}else if(path[len1][len2] == 2){print(len1-1,len2);}else {print(len1,len2-1);}}int main(){while(scanf("%s%s",a+1,b+1)== 2){int len1 = strlen(a+1);int len2 = strlen(b+1);for(int i = 0; i <= len2; i++) dp[0][i] = 0; for(int i = 1; i <= len1; i++){for(int j = 1; j <= len2; j++){if(a[i] == b[j]){dp[i][j] = dp[i-1][j-1] + 1;path[i][j] = 1;}else {//dp[i][j] = max(dp[i-1][j],dp[i][j-1]);if(dp[i-1][j] > dp[i][j-1]){dp[i][j] = dp[i-1][j] ;path[i][j] = 2;}else {dp[i][j] = dp[i][j-1];path[i][j] = 3;}}}} printf("最长公共子序列的长度为:");printf("%d\n",dp[len1][len2]);printf("最长公共子序列为:");print(len1,len2); //递归打印 printf("\n");}return 0;}




原创粉丝点击