【LIS最长上升子序列】O(n^2)与O(nlogn)算法(HDU1257)
2017-08-09 17:25
232 查看
LIS(最长上升子序列)
子序列:不连续元素
如:4 2 3 1 5; 2 3 5就是LIS
有两种方法求,时间复杂度分别为O(n^2)与O(n log n),空间复杂度均为O(n)。但是
第一种可以同时求出LIS本身,而第二种只能求出LIS的长度。
子序列:不连续元素
如:4 2 3 1 5; 2 3 5就是LIS
有两种方法求,时间复杂度分别为O(n^2)与O(n log n),空间复杂度均为O(n)。但是
第一种可以同时求出LIS本身,而第二种只能求出LIS的长度。
//O(n^2) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 30010; int dp[maxn], a[maxn]; /*定义dp[i]:长以ai为结尾的最长上升子序列的长度 以ai结尾的上升子序列是: ①只包含ai的子序列 ②在满足j<i并且aj<ai的以aj为结尾的上升子列末尾,追加上ai后得到的子序列 综合以上两种情况,便可以得到递推关系式: dp[i] = max{1, dp[j]+1| j<i且aj<ai} */ int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;++i) scanf("%d",&a[i]); int ans=0; for(int i=0;i<n;++i) { dp[i]=1; for(int j=0;j<i;++j) { if(a[j]<a[i]) dp[i] = max(dp[i], dp[j]+1); } ans=max(dp[i],ans); } printf("%d\n",ans); } return 0; }
//O(nlogn) #include <cstdio> #include <algorithm> #define INF 0x3f3f3f using namespace std; int dp[30010],a[30010]; /*定义dp[i]:长度为i+1的上升子序列中末尾元素的最小值(不存在就是INF) 最开始全部dp[i]的值都初始化为INF。然 后由前到后逐个考虑数列的元素,对于每个aj, 如果i=0或者dp[i-1]<aj的话,就用dp[i]=min(dp[i],aj)进行更新。 最终找出使得dp[i]<INF的最大的i+1就是结果了。 */ int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;++i) { scanf("%d",&a[i]); dp[i]=INF; //将数的位置都赋值为INF } for(i=0;i<n;++i) *lower_bound(dp,dp+n,a[i])=a[i]; //lower_bound求出的是地址,加上* 指向地址 printf("%d\n",lower_bound(dp,dp+n,INF)-dp); //找到大于等于INF的第一个数,这个数的地址减去首地址 } return 0; }
相关文章推荐
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 【训练题】航线设计 | 使用最长上升子序列(LIS)长度的O(nlogn)算法优化
- nlogn的最长上升子序列的算法(LIS)
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)的O(nlogn) & O(n^2)算法 - 动态规划
- 最长上升子序列(LIS)长度 O(nlogn)算法 hdu1950为例
- 最长上升子序列(LIS)长度的O(n^2)与O(nlogn)算法
- 最长上升子序列(LIS)算法…
- 蓝桥杯算法训练拦截导弹【最长上升子序列 & 最长非下降子序列nlogn 和 n^2】
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 【最长上升子序列LIS】O(n^2)和O(nlogn)算法简记
- 最长上升子序列(LIS)长度的O(nlogn)算法
- [算法] poj 3903 最长上升子序列 dp vs (二分 nlogn)
- [算法] poj 3903 最长上升子序列 dp vs (二分 nlogn)
- 最长上升子序列(LIS) 两种复杂度算法
- 最长上升子序列(LIS)的两种算法
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法