描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
思路:这就是一个单纯的LCS模板题。用二分优化,时间复杂度为O(nlogn)。
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<string>
#include<string.h>
using namespace std;
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
string s;
cin>>s;
int p[1001];
p[0]=-1;
int top=0;
for(i=0;i<s.size();i++)
{
if(s[i]-'0'>p[top])
{
p[++top]=s[i]-'0';
}
else
{
int low=1,high=top;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(s[i]-'0'>p[mid])
{
low=mid+1;
}
else
{
high=mid-1;
}
}
p[low]=s[i]-'0';
}
}
printf("%d\n",top);
}
return 0;
}