首页 > 代码库 > 最长非上升子序列的长度
最长非上升子序列的长度
最长非上升子序列问题是一个经典的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 }
最长非上升子序列的长度
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。