最长公共子序列求解:递归与动态规划方法
来源:互联网 发布:淘宝充话费联通 编辑:程序博客网 时间:2024/06/04 00:23
http://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html
最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。
(1)递归方法求最长公共子序列的长度
1)设有字符串a[0...n],b[0...m],下面就是递推公式。
当数组a和b对应位置字符相同时,则直接求解下一个位置;当不同时取两种情况中的较大数值。
#include<stdio.h>#include<string.h>char a[30],b[30];int lena,lenb;int LCS(int,int); ///两个参数分别表示数组a的下标和数组b的下标int main(){ strcpy(a,"ABCBDAB"); strcpy(b,"BDCABA"); lena=strlen(a); lenb=strlen(b); printf("%d\n",LCS(0,0)); return 0;}int LCS(int i,int j){ if(i>=lena || j>=lenb) return 0; if(a[i]==b[j]) return 1+LCS(i+1,j+1); else return LCS(i+1,j)>LCS(i,j+1)? LCS(i+1,j):LCS(i,j+1);}
用递归的方法优点是编程简单,容易理解。缺点是效率不高,有大量的重复执行递归调用,而且只能求出最大公共子序列的长度,求不出具体的最大公共子序列。
(2)动态规划求最长公共子序列的长度
动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。
1)最长公共子序列的长度的动态规划方程
设有字符串a[0...n],b[0...m],下面就是递推公式。字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列。
0 0
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 最长公共子序列求解:递归与动态规划方法
- 动态规划求解最长公共子序列
- 动态规划求解最长公共子序列
- 动态规划求解最长公共子序列
- LCS最长公共子序列 动态规划方法 递归与非递归算法
- 递归与动态规划---最长公共子序列问题
- 动态规划求解最长公共子序列问题
- 最长公共子序列(动态规划求解)
- 动态规划求解最长公共子序列问题
- 最长公共子序列的动态规划求解
- 最长公共子序列的动态规划求解
- UVA 11020 Multiset应用
- 尝试保存
- 第六章 第六节 滚动条
- nyoj91 阶乘之和 简单DFS
- HDU 3415 Max Sum of Max-K-sub-sequence(求长度不超过K的最大区间和)
- 最长公共子序列求解:递归与动态规划方法
- μC/OS-Ⅱ的中断和时钟
- HDU2159-FATE
- 将优化问题转换为决策问题求解
- 洗牌问题——偶数张扑克牌,分成两等份, 洗牌多少次回到原来顺序?
- 何时重构
- Unity3D NGUI蒙版效果实现方法
- LayoutInflater小结
- 整数与IP地址间的转换