LIS最长上升子序列
2016-05-03 11:54
375 查看
nlgn算法
//dp500-3
#include <cstdio>
#include <algorithm>
const int SIZE=1e5+10;
const int maxn=1<<30;
using namespace std;
int a[SIZE],dp[SIZE];
int Bin(int key,int n,int X[]){
int l=0,r=n;
while(l<=r){
int m=(l+r)>>1;
if(dp[m]>key)r=m-1;
else l=m+1;
}
return l;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
dp[i]=maxn;
}
int ans=0;
for(int i=0;i<n;i++){
int pos=Bin(a[i],n,dp);
printf("%d\n",pos);
if(pos==ans)dp[ans++]=a[i];
else dp[pos]=a[i];
}
printf("%d\n",ans);
}
}
//dp500-3
#include <cstdio>
#include <algorithm>
const int SIZE=1e5+10;
const int maxn=1<<30;
using namespace std;
int a[SIZE],dp[SIZE];
int Bin(int key,int n,int X[]){
int l=0,r=n;
while(l<=r){
int m=(l+r)>>1;
if(dp[m]>key)r=m-1;
else l=m+1;
}
return l;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
dp[i]=maxn;
}
int ans=0;
for(int i=0;i<n;i++){
int pos=Bin(a[i],n,dp);
printf("%d\n",pos);
if(pos==ans)dp[ans++]=a[i];
else dp[pos]=a[i];
}
printf("%d\n",ans);
}
}
相关文章推荐
- c# 把时间写入文件
- ios逆向
- 设置editText密码可见性和特殊字符过滤
- java内存模型
- Android Studio 的.9图编译失败,可以用这个来忽略检查。
- Lecture 1 - Intro to NLP and Deep Learning
- SQL参数化查询的问题
- (BZOJ4538)HNOI2016 网络
- 做项目或者需求
- 选项卡样式重置
- 深入理解按位异或运算符
- TCP连接除了四次挥手断开外,还有什么断开连接的方式?
- JFreeChart画图+jsp页面显示
- Android studio导入工程(Module)失败记录
- bootstrap学习笔记(6)
- mysql遇到的问题
- Docker Java+Tomcat 环境搭建
- Android--@TargetApi
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- android:layout_gravity和android:gravity的区别