Dynamic Programming--Longest Common Subsequence
2016-01-16 13:57
543 查看
问题描述:给定两个序列:X[1...m],Y[1...n],求在两个序列中同时出现的最长序列的长度。(不必是连续的)
穷举法:x中的子序列有2^m个。
检查是否存在于Y中--O(n)。
时间显然是不能接受的。。。
动态规划:
设C[i,j] = |LCS(X[1...i],Y[1...j])|,C[i,j]表示序列X[1...i],Y[1...j]的最长LCS,则C[m,n]就是最后的答案。
C[i,j] = C[i-1,j-1] + 1 …… X[i] == Y[j]
C[i,j] = max(C[i-1,j],C[i,j-1]) …… X[i] != Y[j]
。。。。
穷举法:x中的子序列有2^m个。
检查是否存在于Y中--O(n)。
时间显然是不能接受的。。。
动态规划:
设C[i,j] = |LCS(X[1...i],Y[1...j])|,C[i,j]表示序列X[1...i],Y[1...j]的最长LCS,则C[m,n]就是最后的答案。
C[i,j] = C[i-1,j-1] + 1 …… X[i] == Y[j]
C[i,j] = max(C[i-1,j],C[i,j-1]) …… X[i] != Y[j]
。。。。
int LCS (int lenstr,int lench) {//返回LCS的长度 memset(dp,0,sizeof(dp)); int k; for (int i=1;i<=lenstr;i++) { k=i&1; for (int j=1;j<=lench;j++) if (str[i-1] == ch[j-1]) dp[k][j]=dp[k^1][j-1]+1; else dp[k][j]=max(dp[k][j-1],dp[k^1][j]); } return dp[k][lench]; }有时候会求一个串,这两个串是这个串的子序列,求这个串的最小长度。
int lcs(){ for (int i = 1;i <= len1;++i){ for (int j = 1;j <= len2;++j){ if (s1[i-1] == s2[j-1]) dp1[i][j] = dp1[i-1][j-1] + 1; else{ dp1[i][j] = min(dp1[i-1][j],dp1[i][j-1]) + 1; } } } return dp1[len1][len2]; }
相关文章推荐
- IOS UITextField &UITextView
- A Better solution for the Windows 7 SP1 ADO GUID changes
- UISearchBar总结
- iOSUI-导航控制器全屏滑动返回效果
- iOS UI-自动布局(Autoresizing)
- 从UIImage的矩阵变换看矩阵运算的原理
- UITextField 光标的位置设置获取
- 213,使用UINavigationController实现页面跳转
- easyui 在tabs子页面关闭当前tabs
- iOS 开发学习之 User Interface(3)iOS 坐标系和 UILabel 与 UIButton
- iOS 开发学习之 User Interface(2)UIWindow 视窗
- fail to build phoneME Feature-转
- iOS 开发学习之 User Interface(3)iOS 坐标系和 UILabel 与 UIButton
- QQ互联登陆出现(1054) Unknown column “conuintoken” in “field list”
- workqueue机制分析之wb_workfn函数
- UIAlertView -(警告框)方法总结
- 【Android开发小记--2】百度外卖 UI界面
- 微信官方UI库—WeUI
- 微信官方UI库—WeUI
- 如何使用APUE源代码(UNIX高级编程)-转