最长公共子序列-动态规划-openjudge

来源:互联网 发布:中南林业科技大学知乎 编辑:程序博客网 时间:2024/05/25 12:21
序列str1和序列str2
长度分别为m和n;
创建1个二维数组str[m][n]来保存结果,并初始化为0;

m和n分别从0开始,m++,n++循环:

(默认字符串均不为空)

如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1;
如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}

最后从L[m,n]中的数字一定是最大的,且这个数字就是最长公共子序列的长度


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int main(){    char str1[205];    char str2[205];    int str[205][205];    while(scanf("%s%s",str1+1,str2+1)!=EOF)    {        int length1=strlen(str1+1);        int length2=strlen(str2+1);        memset(str,0,sizeof(str));        for(int i=1; i<=length1; i++)        {            for(int j=1; j<=length2; j++)            {                if(str1[i]==str2[j])                    str[i][j]=str[i-1][j-1]+1;                else                    str[i][j]=max(str[i-1][j],str[i][j-1]);            }        }        printf("%d\n",str[length1][length2]);    }    return 0;}



0 0
原创粉丝点击