最长非上升子序列的长度

  最长非上升子序列问题是一个经典的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 }
原文地址:https://www.cnblogs.com/khan724/p/4143488.html