# 最长递增子序列&&最长公共子序列&&最长公共子串

##### 输入例子:
2
7
89 256 78 1 46 78 8
5
6 4 8 2 17


##### 输出例子:
3


3

#include<iostream>
using namespace std;
int er(int *a,int time)
{//算法核心
if(a==NULL||time<0)
return 0;
int l,r,m,right=0;
int *end=new int[time];
end[0]=a[0];
for(int i=1;i<time;i++)
{
l=0;r=right;
while(l<=r)
{
m=(l+r)/2;
if(a[i]>end[m])
l=m+1;
else
r=m-1;
}
end[l]=a[i];
right=l>right?l:right;
}
return right+1;
}
int main()
{
int n,time;
while(cin>>n)
{
while(n--&&cin>>time)
{
int *a=new int[time];
for(int i=0;i<time;i++)
cin>>a[i];
cout<<er(a,time)<<endl;
}

}
return 0;
}

##### 输入例子:
2
7
89 256 78 1 46 78 8
5
6 4 8 2 17


##### 输出例子:
1 46 78
6 8 17

class L
{
public:
int length;当前位置最长递增子序列的长度</span>
int index;上一个与之比较元素的下标索引</span>
};

#include<iostream>
#include<stack>
using namespace std;
class L
{
public:
int length;
int index;
};
void vd(int *a, int n)
{
if (a == NULL || n < 0)return;
L *p = new L[n];//对应的辅助数组
stack<int> s;
for (int i = 0; i < n; i++)
{
p[i].length = 1;
p[i].index = -1;
}
int max = 0;
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[j]>a[i])
{       //辅助数组的更新
int temp = p[j].length;
if (p[i].length + 1>temp)
{
p[j].length = p[i].length + 1;
p[j].index = i;
}
if (p[j].length > max)//记录最长子序列的长度
max = p[j].length;
}
}
}
int index = 0;
for (int i = 0; i < n; i++)
{
if (p[i].length == max)
{//找出第一个最长子序列，并记录其下标
index = i;
break;
}
}
L temp = p[index];
int t = index;//输出子序列
while (temp.index>=0)
{
s.push(a[t]);
t = temp.index;
temp = p[temp.index];
}
s.push(a[t]);
while (s.size()!=1)
{
cout << s.top() << ' ';
s.pop();
}
cout << s.top()<< endl;
s.pop();
}
int main()
{
int num, time;
while (cin>>num)
{
while (num--&&cin>>time)
{
int *a = new int[time];
for (int i = 0; i < time; i++)
cin >> a[i];
vd(a,time);
}
}
}

## 题目描述

"1A2C3D4B56",10,"B1D23CA45B6A",12
返回：6
int findLCS(string a, int n, string b, int m) {
int **dp = new int*[n+1];//dp[i][j]表示a以i-1位置结尾b以j-1位置结尾时的最长公共子串长度
for (int i = 0; i<n+1; i++)
dp[i] = new int[m+1];
for(int i=0;i<n+1;i++)dp[i][0]=0;
for(int j=0;j<m+1;j++)dp[0][j]=0;
for (int i = 1; i<n+1; i++)
for (int j = 1; j<m+1; j++)
{
if (a[i-1] == b[j-1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
dp[i][j] = dp[i - 1][j - 1];
dp[i][j] = dp[i][j]>dp[i - 1][j] ? dp[i][j] : dp[i - 1][j];
dp[i][j] = dp[i][j]>dp[i][j - 1] ? dp[i][j] : dp[i][j - 1];
}

return dp[n][m];
}

"1AB2345CD",9,"12345EF",7
返回：4

class LongestSubstring {
public:
int findLongest(string a, int n, string b, int m) {
int dp[n+1][m+1];
for(int i=0;i<n+1;i++)
for(int j=0;j<m+1;j++)
dp[i][j]=0;
int max=-1;//用于统计最长的子串长度
for(int i=1;i<n+1;i++)
for(int j=1;j<m+1;j++)
{
if(a[i-1]==b[j-1])//只有2个字符相等时才增加
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>max)max=dp[i][j];
}
return max;
}
};

• 本文已收录于以下专栏：

## 动态规划——最长公共子序列和最长公共子串之Python实现

• 2017年10月22日 20:59
• 2KB
• 下载

## 编辑距离，最长公共子序列，最长公共子串，最长递增子序列

1.编辑距离 编辑距离，又称Levenshtein距离（也叫做Edit Distance），是指两个字串之间，由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符...

## 最长重复子串，最长公共子序列， 最长公共子串

• fjqcyq2
• 2015年08月11日 20:26
• 442

## 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

举报原因： 您举报文章：最长递增子序列&&最长公共子序列&&最长公共子串 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)