Dynamic Programming之Longest Increasing Subsequence (LIS)问题

来源:互联网 发布:windows任务栏透明 编辑:程序博客网 时间:2024/05/20 23:02

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


        这个算法的时间复杂度为O(n2)。举个例子来演示这个算法,取一个序列初始化如下:

= {9, 5, 2, 8, 7, 3, 1, 6, 4}
lis 
= {1, 1, 1, 1, 1, 1, 1, 1, 1}//初始化时lis全部要初始化为1,这与以往经典的DP问题不同


然后使用这个算法,可以得到如下的结果:

= {9, 5, 2, 8, 7, 3, 1, 6, 4}
lis 
= {1, 1, 1, 2, 2, 2, 1, 3, 3}

 

C++实例如下:

原创粉丝点击