题意:求给定序列的最长升序子串长度
思路:用一个数组存放当前最长子串,要求此串的各个数字与其他相同大小的最长子串相比最小。更新时采用二分查找。
输入:
7
1 7 3 5 9 4 8
输出:
4
#include <stdio.h>
#include <string.h>
#define N 1005
int s[N],t[N];
int n;
int find(int high,int x){
int low,mid;
low = 0;
while(low <= high){
mid = (low+high)/2;
if(t[mid] == x)
return mid;
else if(t[mid]<x)
low = mid+1;
else
high = mid-1;
}
return low;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
int i,j,len = -1;
for(i = 1;i<=n;i++)
scanf("%d",&s[i]);
for(i = 1;i<=n;i++){
j = find(len,s[i]);
if(j>len)
t[++len] = s[i];
else
t[j] = s[i];
}
printf("%d\n",len+1);
}
return 0;
}
3903:
#include <cstdio>
#include <cstring>
#define N 100005
using namespace std;
int n,t[N],len;
int find(int x,int high){
int low,mid;
low = 0;
while(low <= high){
mid = (low+high)>>1;
if(t[mid]>=x)
high = mid-1;
else
low = mid+1;
}
return low;
}
int main(){
while(scanf("%d",&n)!=EOF){
int i,j,s;
len = -1;
for(i = 0;i<n;i++){
scanf("%d",&s);
j = find(s,len);
t[j] = s;
if(j == len+1)
len++;
}
printf("%d\n",len+1);
}
return 0;
}