Longest Increasing Subsequence(LIS)问题属于经典的DP问题。
其DP是模型:
对于序列a[total],使用lis[i]表示前i位包含第i个元素的LIS,因此有转移方程
if(a[j] > a[i])
lis[j] = max( list[i] + 1, list[j])
算法描述如下:
for
i
=
1
to
total
-
1
for j = i + 1 to total
if a[j] > a[i] then
if lis[i] + 1 > lis[j] then
lis[j] = lis[i] + 1
for j = i + 1 to total
if a[j] > a[i] then
if lis[i] + 1 > lis[j] then
lis[j] = lis[i] + 1
这个算法的时间复杂度为O(n2)。举个例子来演示这个算法,取一个序列初始化如下:
a
=
{
9
,
5
,
2
,
8
,
7
,
3
,
1
,
6
,
4
}
lis = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1} //初始化时lis全部要初始化为1,这与以往经典的DP问题不同
lis = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1} //初始化时lis全部要初始化为1,这与以往经典的DP问题不同
然后使用这个算法,可以得到如下的结果:
a
=
{
9
,
5
,
2
,
8
,
7
,
3
,
1
,
6
,
4
}
lis = { 1 , 1 , 1 , 2 , 2 , 2 , 1 , 3 , 3 }
lis = { 1 , 1 , 1 , 2 , 2 , 2 , 1 , 3 , 3 }
C++实例如下: