NYOJ 17 单调递增最长子序列 (二分 STL,lower_bound)

来源:互联网 发布:ubuntu 12.04 配置dns 编辑:程序博客网 时间:2024/05/18 03:09

单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3aaaababcabklmncdefg
样例输出
137
注 - 此题为 :NYOJ 17 单调递增最长子序列  (STL,lower_bound)

题意:二分  找  最长上升子序列的长度。

STL:   t = lower_bound(s,s+top,m)-s; 返回值第一个大于等于 m 的数的  地址 ,s 是一个数组,K 为其长度,要减 s 得第一个大于等于m 的数的下标

将那个位置用 m  替换   (得到的最长上升子序列,并不一定是正确的,但是,长度是正确的)

已AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char ch[12000],str[12000];int main(){int n;scanf("%d",&n);while(n--){int len,i,j;scanf("%s",ch);len=strlen(ch);str[0]=ch[0];j=1;for(i=1;i<len;++i){if(ch[i]>str[j-1]){str[j]=ch[i];j++;}else{int t=lower_bound(str,str+j,ch[i])-str;str[t]=ch[i];}}printf("%d\n",j);}return 0;}

1 0
原创粉丝点击