递归解决最长公共子序列问题(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;
}
}
什么是最长公共子序列?
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;
}
}
相关文章推荐
- 用动态规划的方法解决LCS(最长公共子序列)的问题
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 动态规划解决最长公共子序列LCS问题
- 51nod 最长公共子序列问题(动态规划)(LCS)(递归)
- 《github一天一道算法题》:动态规划法解决最长公共子序列(LCS)问题的最简单方法
- 三、动态规划算法解最长公共子序列LCS问题(2011.12.13重写)
- 三、动态规划算法解最长公共子序列LCS问题(2011.12.13重写)
- 非递归解决组合问题
- 动态规划---LCS问题 最长公共子序列
- 递归完美解决"傻子造成的问题"
- 用汇编与c解决递归问题之比较
- 三、动态规划算法解最长公共子序列LCS问题(2011.12.13重写)
- [企业信息化]关于LCS2005的安装总结,但还有很多问题没有解决,希望能够对象我一样的新手有所帮助
- LCS最长公共子序列问题
- 程序员编程艺术第十一章:最长公共子序列(LCS)问题
- 游标递归解决树形节点删除问题
- 递归与非递归解决组合问题
- 解决LCS无法发送网址的问题
- 递归知多少 递归过程演示、经典问题解决
- 不用递归解决汉诺塔问题