最长非上升子序列的长度
最长非上升子序列问题是一个经典的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 }