码迷,mamicode.com
首页 > 其他好文 > 详细

最长上升子序列

时间:2015-06-27 21:09:40      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:


问题描述
        对于一串数A={a1a2a3an}它的子序列为S={s1s2s3sn},满足{s1<s2<s3<…<sm}。求A的最长子序列的长度。

动态规划法

算法描述:
        设数串的长度为n,L[i]为以第i个数为末尾的最长上升子序列的长度,a[i]为数串的第i个数。
        L[i]的计算方法为:从前i-1个数中找出满足a[j]<a[i](1<=j<i)条件的最大的L[j],L[i]等于L[j]+1。
动归表达式:
技术分享

代码实现:

  1. int LIS(int a[], int n)  
  2. {  
  3.     int len[MAXSIZE];  
  4.     int i, j;  
  5.     int maxlen = 0;  
  6.     //计算以第i个数为结尾的最长上升子序列的长度  
  7.     for (i = 1; i <= n; i++)  
  8.     {  
  9.         len[i] = 0;  
  10.         //从前i-1个数中找出满足a[j]<a[i](1<=j<i)条件的最大的L[j]  
  11.         for (j = i-1; j >= 1; j--)  
  12.         {  
  13.             if (a[j] < a[i] && len[j] > len[i])  
  14.             {  
  15.                 len[i] = len[j];  
  16.             }  
  17.         }  
  18.         len[i]++;  
  19.   
  20.         if (len[i] > maxlen)  
  21.         {  
  22.             maxlen = len[i];  
  23.         }  
  24.     }  
  25.     return maxlen;  
  26. }  

上述算法的时间复杂度为O(n2)。

最长上升子序列

标签:

原文地址:http://www.cnblogs.com/Alex0111/p/4604549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!