Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2834000
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-08-28 15:53:16

题意:给出两个字符串,求出他们最大的 Common Subsequence。所谓字符串A的 subsequence,就是A所含的字符的一部分或者全部组成的字符串,并且字符的顺序和A中出现的顺序相同。【求两个字符串的最长公共子序列 (LCS)】

思路:这题是简单的动态规划题。

用f [ i ][ j ]表示处理到字符串A的第 i 位 和 字符串B第 j 位时的最大值。
状态转移方程如下:
f [ i ][ j ] = f[ i - 1 ][ j - 1 ] + 1  (A[ i ] == B[ j ])
f [ i ][ j ] = max( f[ i - 1 ][ j ], f [ i ][ j - 1] )    (A[ i ] != B[ j ])
由于每次循环计算只和上一行状态有关
一看就知道要填表,两层循环,o(n2)搞掂

点击(此处)折叠或打开

  1. #include
  2. using namespace std;

  3. #define M 5005
  4. #define max(x,y) x>y?x:y
  5. int dp[M][M];
  6. char a[M], b[M];

  7. int main()
  8. {
  9.     int i, j, la, lb;
  10.     while (~scanf ("%s%s", a, b))
  11.     {
  12.         la = strlen (a), lb = strlen (b);
  13.         for (i = 0; i < la; i++)    //边界初始化
  14.             dp[i][0] = 0;
  15.         for (j = 0; j < lb; j++)
  16.             dp[0][j] = 0;
  17.         for (i = 1; i <= la; i++)
  18.         {
  19.             for (j = 1; j <= lb; j++)
  20.             {
  21.                 //状态转移
  22.                 if (a[i-1] == b[j-1])
  23.                     dp[i][j] = dp[i-1][j-1] + 1;
  24.                 else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
  25.             }
  26.         }
  27.         printf ("%d\n", dp[la][lb]);
  28.     }
  29.     return 0;
  30. }
  31. /*
  32. abcfbc abfcab
  33. 4
  34. programming contest
  35. 2
  36. abcd mnp
  37. 0
  38. */

阅读(918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~