您的位置:首页 > 其它

递归解决最长公共子序列问题(LCS)

2017-06-10 22:41 309 查看
如何用递归解决LCS(最长公共子序列)?

什么是最长公共子序列?
PS.借用了邓俊辉老师的PPT图

主要使用两种策略,也是递归中最重要的两种思想

1.减而治之
2.分而治之

现在来看一个例子
A序列: didacticA , A[0, m]
B序列: advantA, B[0, n]
求这两个序列的最长公共子序列,显而意见,这个序列是datA

那么用程序如何解决这个问题呢?
LCS[m, n] 无非三种情况
1.m == -1 || n == -1 则取空序列"", 也就是递归基
2.A[m] == A
则取LCS(m-1, n-1)+1, 因为最后一个字符相同 我们加上1 然后截去这个字符把剩下的两个串继续比较,也就是减而治之的策略
3.A[m]  != A
, 这时候

我们将一个问题转化为两个子问题继续求解,这就是分而治之的思想

贴出最终解决代码

#include<iostream>
using namespace std;
string a, b;
int LCS(int m, int n) {
  if(m == -1 || n == -1) return 0;
  if(a[m] == b
) return LCS(m-1, n-1)+1;
  if(a[m] != b
) return LCS(m, n-1) > LCS(m-1, n)?LCS(m, n-1):LCS(m-1, n);
}
int main() {
  int t;
  cin >> t;
  while(t--) {
    cin >> a >> b;
    cout << LCS(a.size()-1, b.size()-1) << endl;
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: