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;
}
相关文章推荐
- Java 接口与抽象类
- 程序员未来的方向,可以考虑考虑
- 【我的技术我做主】Apache Httpd Web服务器详解
- 你知道RAID的初始化过程吗?
- 欢迎使用CSDN-markdown编辑器
- Google与沃尔玛的薪酬战略—方法不同,目的一致
- MySQL引擎讲解
- nim manual(二)
- Shell替换
- TextView属性大全
- 面向对象三大特点:封装,继承,多态
- qt下编写andriod程序必须报错总结
- 01_02 JSP基础语法之page指令1
- 黑马程序员——网络编程3:网络通讯组件介绍及演示-下
- jQuery插件开发
- 以前写的一个sniffer网络监听程序(作为备忘)
- 聊天2
- 46 个非常有用的 PHP 代码片段
- Eclipse 闪退/无法启动/一闪而过打解决办法
- 对于用js获取元素的css样式属性(getComputedStyle,currentStyle,style)(getPropertyValue,getAttribute)