最长公共子序列

来源:互联网 发布:剑三萝莉具体数据 编辑:程序博客网 时间:2024/05/01 00:15
所有的公共最长上升序列有三种解法:
(1)枚举法
(2)递归

(3)动态规划


枚举法:

就是枚举较短串中的所有子串z^n,然后直接进行字符串匹配。总之,慢死你。

递归,动态规划都是一样的方程



如果要输出路径,那很明显是在对角线移动的时候那个位置就是路径。

只需要用一个数组记录下当前位置是从之前的哪个位置转移过来的即可。

如果是从上面或者左边过来的,那就不用输出,如果是对角线来的话,那就输出呗!

#include<stdio.h>#include<string.h>int dp[1000][1000];int max(int a,int b){    return a=a>b?a:b;}void prit(int b[][100],char *x,int i,int j){if(i==0||j==0) return ;if(b[i][j]==0){prit(b,x,i-1,j-1);printf("%c",x[i]);}else if(b[i][j]==1){prit(b,x,i-1,j);}else prit(b,x,i,j-1);}int main(){    char s1[1000],s2[1000];int b[100][100];    while(scanf("%s%s",s1+1,s2+1)!=EOF)    {        memset(dp,0,sizeof(dp));        int i=0;        int j=0;        for(i=1;s1[i]!='\0';i++){for(j=1;s2[j]!='\0';j++)            {                if(s1[i]==s2[j])                {                    dp[i][j]=dp[i-1][j-1]+1;b[i][j]=0;                }                else if(dp[i-1][j]>dp[i][j-1])                {                    dp[i][j]=dp[i-1][j];b[i][j]=1;                }else{dp[i][j]=dp[i][j-1];b[i][j]=-1;}            }        }        printf("%d\n",dp[i-1][j-1]);prit(b,s1,i-1,j-1);printf("\n");    }}


0 3
原创粉丝点击