首页 > 代码库 > 最长非上升子序列的长度

最长非上升子序列的长度

 

  最长非上升子序列问题是一个经典的DP问题。如下给出完整的问题描述:

  给你一串序列 A1,A2,A3,A4,A5........An。让你找出它的某个最长子序列 S1,S2,S3,S4.........Sm。使得 S1<=S2<=S3<=S4.........<=Sm。

从问题描述中,我们可以把 <= 换成各种其他的关系符号从而变成最长非下降子序列等,他们都只是关系描述不同,其本质都是一样的。现在,我们来只需总结一下最长非上升子序列问题即可应用到其他类型。

  这既然是一个经典的DP问题,那么找出他的状态转移方程显然是必须的。首先,我们用dp[i]来表示 1--i 的最长非上升子序列的长度。那么dp[i]=Max(dp[j])+1,j∈[1, i-1]。显然dp[1]=1。那么去哦们只需从第二项开始遍历即可。

 

算法描述如下:

1.dp[1] = 1;

2.依此遍历整个序列,每次求出从第一项到当前项的最长子序列长度。

3.找dp数组里最大的那个就是整个序列的最长子序列长度。

 

算法复杂度为:O(n^2)

 1 int Num[N]; 2 int dp[N]; 3  4 int Lis(int n) 5 { 6     memset(dp, 0, sizeof dp); 7     int ans; 8     dp[0] = 1; 9     for(int i=1; i<n; i++)10     {11         ans = dp[i];12         for(int j=0; j<i; j++)13             if(Num[i] <= Num[j] && dp[j]>ans)14                 ans = dp[j];15         dp[i] = ans+1;16     }17     ans = 0;18     for(int i=0; i<n; i++)19         if(dp[i] > ans)20             ans = dp[i];21     return ans;22 }

 

最长非上升子序列的长度