LIS:最长上升子序列(Longest Increasing Subsequence),给定n个整数,A1,A2....An,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列:删除0个或多个数,其他数的顺序不变)。
时间复杂度:O(n^2)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10];
int f[10];
int n,ans=1;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
f[i]=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(a[j]<a[i])
f[i]=max(f[i],f[j]+1);
}
ans=max(f[i],ans);
}
cout<<ans;
}
时间复杂度:O(nlogn)
#include<iostream>
using namespace std;
const int maxn = 100;
int a[maxn];
int dp[maxn];
int n;
int LIS()
{
int len =0;
for (int i=0; i < n; i++)
{
int temp = lower_bound(dp,dp+len,a[i])-dp;
if(len <= temp) dp[len++] = a[i];
else dp[temp] = a[i];
}
return len;
}
int main()
{
cin>>n;
for (int i = 0; i < n; i++ )
cin >> a[i];
cout<<LIS();
}
LCS: 最长公共子序列(The longest common subsequence),一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。
待续~