您的位置:首页 > 其它

17 单调递增最长子序列

2015-08-09 12:24 363 查看


单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4

描述求一个字符串的最长递增子序列的长度

如:dabdbf最长递增子序列就是abdf,长度为4

输入第一行一个整数0<n<20,表示有n个字符串要处理

随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg


样例输出
1
3
7


如题目所说,这道题是个求最大单调子序列的题型,这种题之前的博客也详细讲述过方法,这里大概回忆一下

一个数组,每次在这个数组里二分查找第一个不小于某个数(根据题目要求可能不同)的的数据的位置,然后替换更新,如果数组里的值全部都小于这个数,那么就把这个数放在数组最后,数组的长度增加 1 ,就这样下去,虽然最后求出的序列不是想要的最大递增子序列,但是长度是所需要的长度,因为按这样的方法下去,只有遇到更长的单调子序列才会更新最大长度,也就可以更新出最大的长度,二分查找在有序数组里使用比较方便,效率高,可以直接调用函数,不过个人觉得自己构造也是可以的,这样还可以增加自己对程序的掌控,毕竟自己写的函数,比较好控制些,不过推荐使用函数....比较方便吧

#include<stdio.h>
#include<string.h>
char x[10005],y[10005];
int len;
int search(char s)//二分查找函数
{
int l=0,r=len,mid;
while(l<r)
{
mid=(l+r)/2;
if(y[mid]<s)
{
l=mid+1;
}
else
{
r=mid;//这里是为了实现相应的功能
}
}
return l;
}

int main()
{
int t,i,j;
scanf("%d",&t);
getchar();//格式
while(t--)
{
gets(x);
y[0]=0;len=0;
for(i=0;x[i]!=0;++i)
{
j=search(x[i]);//找到相应位置
y[j]=x[i];
if(j==len)//判断是否延长长度
{
++len;
}
}
printf("%d\n",len);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: