首页 >> 大全

剑指offer(最长子序列)

2023-10-10 大全 26 作者:考证青年

最长子序列

注意区分最长子序列与最长公共子串(连续)的区别。求两个字符串的最长公共子串(KMP等)后续需要整理,现在先使用动态规划的方法讨论LCS问题(暴力法时间复杂度是指数级)

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

长子次子继承有什么说法吗_族谱长子次子_

首先考虑最大公共子序列问题是否满足动态规划问题的两个基本特性:

#include 
#include 
#include  
using namespace std;
int max(int a, int b);/* Returns length of LCS for X[0..m-1], Y[0..n-1] */
int lcs(char *X, char *Y, int m, int n)
{vector <vector<int> > L(m+1, vector<int> (n+1));int i, j;/* Following steps build L[m+1][n+1] in bottom up fashion. Notethat L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */for (i = 0; i <= m; i++){for (j = 0; j <= n; j++){if (i == 0 || j == 0)L[i][j] = 0;else if (X[i - 1] == Y[j - 1])L[i][j] = L[i - 1][j - 1] + 1;elseL[i][j] = max(L[i - 1][j], L[i][j - 1]);}}/* L[m][n] contains length of LCS for X[0..n-1] and Y[0..m-1] */return L[m][n];
}/* Utility function to get max of 2 integers */
int max(int a, int b)
{return (a > b) ? a : b;
}/*测试上面的函数 */
int main()
{char X[] = "AGGTAB";char Y[] = "GXTXAYB";int m = strlen(X);int n = strlen(Y);cout << lcs(X, Y, m, n) << endl;getchar();return 0;
}

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了