#include<stdio.h>
#include<string.h>
#define N 10001
#define MAX(m,n) ((m)>(n)?(m):(n))
char a[N],b[N];
int d[N][N];
int cmp(const void *a,const void *b)
{
return *(char *)a-*(char *)b;
}
int My_Cancel(int len)/*删除相邻的同样数据,不相邻的并不删除,即aabbab,输出abab不是
ab,成为单调递增,否则成为单调不减序列**/
{
int i,j=0;
for(i=0;i<len;i++)
{
if(a[i+1]==a[i])
continue;
else
{
a[j+1]=a[i+1];
j++;
}
}
return j;
}
int LISL(int len)
{
int i,j;
for(i=1;i<=len;i++)
d[i][0]=0;
for(j=1;j<=len;j++)
d[0][j]=0;
for(i=1;i<=len;i++)
for(j=1;j<=len;j++)
if(a[i-1]==b[j-1])
d[i][j]=d[i-1][j-1]+1;
else
d[i][j]=MAX(d[i][j-1],d[i-1][j]);
return d[len][len];
}
int main()
{
int T,len1,len2;int i,j;
scanf("%d%*c",&T);
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(d,0,sizeof(d));
scanf("%s%*c",a);
len1=strlen(a);
len2=My_Cancel(len1);
memcpy(b,a,sizeof(a));
qsort(b,len2,sizeof(char),cmp);
printf("%d\n",LISL(len2));
}
return 0;
}
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.