题目描述:
给出S={1,2,…,n }到它自身的一个映射(一一对应),求出最长不下降子序列的长度,即LIS问题。
基本思想:
1. dp
设m[i]表示映射到{1,2,...,i}的最长不下降序列的长度,则有
当 0<=j<=i-1, data[i]>data[j] 时, m[i] = max(m[j]) + 1;
算法复杂度O(n^2)
2. dp+二分搜索
D(i) = min { data[j] | m[j] = i }; 表示长度为 i 的非降子序列的最后一个元素
这样D(i) 必然是一非递减序列,对于序列元素 data(i), 在D中查找最大的 j , 使得 D(j) <=data(i), 则以
data(i) 结尾的最长不下降子序列长度为 j+1,否则更新D中的数据。由于D非递减,所以可用二分查找法,故而
此算法效率为 O( nlogn )。此算法关键在于二分查找法.(此算法未考虑多对一的映射)
D[1] = data[1];
int c = 1;
for(j=2; j<=p; ++j)

...{
int l = 1, r = c;
while(l<r)

...{
k = (r+l)/2;
if(D[k] < data[j])
l = k+1;
else if(D[k] > data[j])
r = k-1;
}
if(D[l]<data[j])
D[++l] = data[j];
else if( D[l] > data[j] )
D[l] = data[j];
if(l>c)
++c;
}
给出S={1,2,…,n }到它自身的一个映射(一一对应),求出最长不下降子序列的长度,即LIS问题。
基本思想:
1. dp
设m[i]表示映射到{1,2,...,i}的最长不下降序列的长度,则有
当 0<=j<=i-1, data[i]>data[j] 时, m[i] = max(m[j]) + 1;
算法复杂度O(n^2)
2. dp+二分搜索
D(i) = min { data[j] | m[j] = i }; 表示长度为 i 的非降子序列的最后一个元素
这样D(i) 必然是一非递减序列,对于序列元素 data(i), 在D中查找最大的 j , 使得 D(j) <=data(i), 则以
data(i) 结尾的最长不下降子序列长度为 j+1,否则更新D中的数据。由于D非递减,所以可用二分查找法,故而
此算法效率为 O( nlogn )。此算法关键在于二分查找法.(此算法未考虑多对一的映射)





















