1. 问题描述
设n个元素的序列存储在数组A[0..n-1]中,求序列中最长递增子序列(不要求连续)的长度。
2. 递推公式
设LIS[i]为序列A[0..i]中最长递增子序列的长度。则:
LIS[i] = 1 i = 0,
LIS[i] = max{1, LIS[k] + 1}A[i] > A[k]且0<=k<i, i = 1, 2, ..., n-1
代码如下:
int maxLIS(int A[], int n)
{
int LIS[n], i, k;
for (i = 0;i < n;i++)
{
LIS[i] = 1;
for (k = 0;k < i;k++)
if (A[i] > A[k] && (LIS[k] + 1) > LIS[i])
LIS[i] = LIS[k] + 1;
}
return LIS[n - 1];
}
时间复杂度为O(n)。