最长公共子序列问题

来源:互联网 发布:linux svn数据迁移 编辑:程序博客网 时间:2024/05/22 10:28

最长公共子序列问题

Time Limit: 1000MS Memory limit: 65536K

题目描述

 给定两个序列X=

输入

输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。

输出

每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。

示例输入

ABCBDABBDCABA

示例输出

4

提示

这里主要是通过一个二维数组来储存公共子序列,(我们要区分一下公共子序列和子串啊!)
一层一层的来比较:
首先全都初始化:就是把带0的下标初始化为0就可以了。
然后用整个b字符串和a字符串比较,比如例题第一个a字符为A,则我们把所有b字符带A的全加一,,
一步一步来寻找,,
这里如果深入之后会带来问题:怎样加呢?
我们想啊:
1..如果a的第i个字符与b的第j个字符相等,那就在前一个的基础上加1,即a[i][j] = a[i-1][j-1]+1,,
有同学会问了。为什么?
因为我们找到相等后,就会在比较前一个数上加1,这里的前一个就是a[i-1][j-1]+1也是这一行及以前这一列及以前最大的,,
2..如果不相等时,我们想啊!,不相等哎!我们就找他前一个比较值那个打就行了a[i][j] = MAX(a[i][j-1],a[i-1][j])
为什么这里不是直接等于a[i-1][j-1]呢?
如果你有这样的问题就说明你还是不懂其中真意啊!!!~~
因为我们找的并不是真正比较的值而是找的在它之前最大的(这是关键),而我们找的a[i-1][j-1]并不一定是最大的,(前一个(也就是第一种情况)是因为加1故肯定是最大的)这与我们索要找的值不符,,是吧!如果你还不懂那你找个例题模拟一下!!奋斗
  1. #include<stdio.h>   
  2. #include<string.h>   
  3. #include<stdlib.h>   
  4. #define N 600   
  5. int main()   
  6. {   
  7.     int n,m,i,j;   
  8.     int a[N][N];   
  9.     char x[N],y[N];   
  10.     while(gets(x)!=NULL)   
  11.     {   
  12.         gets(y);   
  13.         n = strlen(x);   
  14.         m = strlen(y);   
  15.         for(i = 0; i <= n; i++)   
  16.         {   
  17.             a[i][0] = 0;   
  18.         }   
  19.         for(i = 0; i <= m; i++)   
  20.         {   
  21.             a[0][i] = 0;   
  22.         }   
  23.         for(i =  1; i <= n; i++)   
  24.         {   
  25.             for(j = 1; j <= m; j++)   
  26.             {   
  27.                 if(x[i-1]==y[j-1])   
  28.                 {   
  29.                     a[i][j] = a[i-1][j-1]+1;   
  30.                 }   
  31.                 else  
  32.                 {   
  33.                     if(a[i-1][j] > a[i][j-1])   
  34.                     {   
  35.                         a[i][j] = a[i-1][j];   
  36.                     }   
  37.                     else  
  38.                         a[i][j] = a[i][j-1];   
  39.                 }   
  40.             }   
  41.         }   
  42.         printf("%d\n",a[n][m]);   
  43.     }   
  44.     return 0;   
  45. }   

 代码菜鸟,如有错误,请多包涵!!

0 0
原创粉丝点击