寻找子序列
来源:互联网 发布:用java 编写一个计算器 编辑:程序博客网 时间:2024/05/16 05:17
1.最长不降子序列:
给出数组A[n],在其中找到最长的子序列subA,要求subA中每一项都大于等于前一项。
O(n2):f[n]表示以第n个数为结尾的不降子序列的长度。n从1开始。f[0] = 0,A[0] = -10000000000,递推公式:f[1] = 1. f[2]= 2 ( A[2] >= A[1] ) f[2] = 1 (A[2] < A[1])
一般的,有f[i] = max{f[j]} + 1, A[j] <= A[i]且j<i 1<=i<=n。
max{f[i]} 1<=i<=n即最长不降子序列的长度,可增加数组保存子序列
2.最长公共子序列:
O(m*n)
给出串A[n],B[m],找最长公共子串subAB。
f[i][j]表示A取到前i字符,B取到前j字符时最长公共子串的长度。
f[i][j] = f[i-1][j-1] (A[i] == B[j])
f[i][j] = max{f[i][j-1],f[i-1][j]} (A[i] != B[j])
f[n][m]为最长公共子串长度
3.最大子串和
O(n)
给出数组A,求A的和最大的连续子串。
for (int i = 0; i < n ; i++)
{
cur += A[i];
if (cur <= 0)
cur = 0;
if (cur >= maxx)
maxx = cur;
}
4.最长公共子串 (连续)
给出两串s1 ,s2.求其最长公共子串。
LCS (DP)
O(m*n)
构造二维矩阵,对应位置字符相同,置1,否则为0.
找所有对角线连续1最大的个数。
优化:只记录矩阵中的当前行 每次记录当前行中最大的值。
GST(后缀树)
将s1 s2合并为s1#s2$,压入后缀树,找到最深的非叶子节点,该节点的叶子节点既有#又有$。该节点表示的串即为所求。
可扩展为多个串的最长公共子串。
- 寻找子序列
- 寻找最长递增子序列
- 寻找最长递增子序列
- 寻找最长递增子序列
- 寻找最长递增子序列
- 寻找数组中和最大的子序列
- 一、寻找最大连续子序列
- 动态规划--寻找最长递减子序列
- 寻找最大子序列并输出
- python实现寻找最长回文子序列
- 用二分法寻找最长连续单调递增子序列
- 寻找最长递增子序列 的两方法效率比较
- HDOJ 1238:Substrings 寻找最长子序列 解题报告
- POJ 4044 寻找最长连续公共子序列
- 动态规划经典问题:寻找最长公共子序列
- 寻找两个串的最长公共子序列
- 关于寻找两个字符串中最长子序列的问题
- 寻找递增的三元子序列——C++实现
- 移动互联网2011年终盘点:全球手机用户总量为59亿
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
- 自动升级的稳定性
- Books that android framework developers should read
- Linux Shell编程基础
- 寻找子序列
- ASoC – ALSA for System on Chip Devices
- 导入文件时的判断
- ListView动态加载数据
- Memcache的使用和协议分析详解
- .so正确编译进apk里打包
- asp.net中如何向存储过程传递参数
- JDBC学习(1)-数据库建立连接
- 没有include <string>