首页 > 代码库 > 最长递增的子序列(模板)
最长递增的子序列(模板)
一般情况:
[cpp] view plaincopy
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- int a[1005],dp[1005],n;
- int LIS()
- {
- int i,j,ans,m;
- dp[1] = 1;
- ans = 1;
- for(i = 2;i<=n;i++)
- {
- m = 0;
- for(j = 1;j<i;j++)
- {
- if(dp[j]>m && a[j]<a[i])
- m = dp[j];
- }
- dp[i] = m+1;
- if(dp[i]>ans)
- ans = dp[i];
- }
- return ans;
- }
二分优化
[cpp] view plaincopy
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- int a[40005],dp[40005],n;
- int bin(int size,int k)
- {
- int l = 1,r = size;
- while(l<=r)
- {
- int mid = (l+r)/2;
- if(k>dp[mid])
- l = mid+1;
- else
- r = mid-1;
- }
- return l;
- }
- int LIS()
- {
- int i,j,ans=1;
- dp[1] = a[1];
- for(i = 2; i<=n; i++)
- {
- if(a[i]<=dp[1])
- j = 1;
- else if(a[i]>dp[ans])
- j = ++ans;
- else
- j = bin(ans,a[i]);
- dp[j] = a[i];
- }
- return ans;
- }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。