LCS 最大公共序列算法

来源:互联网 发布:网络品牌策划 编辑:程序博客网 时间:2024/05/16 17:22


点击打开链接




会长就是会长,,,,


/*LCSBDCABAABCBDABdp[i][j]//第一个字符串在第i个字符前且第二个串在第j个字符前可构成的最长子序列的长度 dp[i][j] = 0  i=0 || j=0dp[i-1][j-1]+1     str1[i]==str2[j]max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j]*/#include<cstdio>#include<cstring>#include<stack>#include<algorithm>using namespace std;int main(){char str1[20];char str2[20];scanf ("%s %s",str1+1,str2+1);str1[0] = str2[0] = '0';int l1 = strlen(str1)-1;int l2 = strlen(str2)-1;int dp[20][20] = {0};//0  i=0 || j=0for (int i = 1 ; i <= l1 ; i++){for (int j = 1 ; j <= l2 ; j++){if (str1[i] == str2[j])//dp[i-1][j-1]+1     str1[i]==str2[j]dp[i][j] = dp[i-1][j-1] + 1;elsedp[i][j] = max(dp[i-1][j],dp[i][j-1]);//max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j]//printf("dp[%d][%d]==%d\n",i,j,dp[i][j]);}//printf("\n");}//回溯求LCS int pos1 = l1;int pos2 = l2;stack<char> S;while (pos1 > 0 && pos2 > 0){//printf("dp[pos1-1][pos2]==%d\tdp[pos1][pos2-1]==%d\n",dp[pos1-1][pos2],dp[pos1][pos2-1]);if (str1[pos1] == str2[pos2]){S.push(str1[pos1]);pos1--;pos2--;}else if (dp[pos1-1][pos2] > dp[pos1][pos2-1])pos1--;elsepos2--;}while (!S.empty()){printf ("%c%c",S.top(),(S.size() == 1) ? '\n' : ' ');S.pop();}printf ("%d\n",dp[l1][l2]);return 0;}





原创粉丝点击