51nod 最长公共子序列问题

来源:互联网 发布:淘宝淘气值申请信用卡 编辑:程序博客网 时间:2024/05/22 12:17

代码:

#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define MAX 1001#define max(x,y) ((x)>(y)?(x):(y))char s1[MAX], s2[MAX];int maxLen[MAX][MAX];char ans[MAX];int main(){    int k = 0;    scanf("%s%s", s1,s2);    int len1 = strlen(s1);    int len2 = strlen(s2);    for (int i = 1; i <= len1; i++)    {        for (int j = 1; j <= len2; j++)        {            if (s1[i-1] == s2[j-1])                maxLen[i][j] = maxLen[i - 1][j - 1] + 1;            else maxLen[i][j] = max(maxLen[i][j - 1], maxLen[i-1][j]);        }    }    /*for (int i = 1; i <= len1; i++)    {        for (int j = 1; j <= len2; j++)        {            printf("%d ",maxLen[i][j]);        }        printf("\n");    }*/    int x_len = len1;    int y_len = len2;    int i,j,o=0;    for(i = x_len, j = y_len; i >= 1 && j >= 1;)    {        if(s1[i - 1] == s2[j - 1])        {            //cout << s1[i - 1];//倒序打印的            ans[o++]=s1[i-1];            i--;            j--;        }        else        {            //  if(arr[i][j -1] >= arr[i - 1][j])//打印:B A D B            if(maxLen[i][j -1] > maxLen[i - 1][j]) //打印:A B C B            {                j--;            }            else            {                i--;            }        }    }    for(int i=strlen(ans)-1;i>=0;i--)        printf("%c",ans[i]);    //for(int i=0;i<strlen(ans);i++)     //   printf("%c",ans[i]);    //printf("%s\n", ans);    return 0;}


0 1
原创粉丝点击