求一个字符串的最长递增子序列的长度。设计基于动态规划思想的算法。
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
动态规划的思想,从前向后遍历每一个点作为最大值,即递增子序列的的尾缀。
然后从前到这个点之前遍历,查看有没有比这个小的,
如果有:
/*
if(b[i]>b[j]) b[i]=b[i];//即以i为尾时,递增子序列更长,s[i]作为尾巴
if(b[i]==b[j]) b[i]++;//因为我们可以把s[i]作为尾部即最大值放到s[j]后面,最长自增子序列长度+1
if(b[i]<b[j] ) b[i]=b[j]+1;//我们让s[i]作为尾部即最大值,放到s[j]后面,最长自增子序列长度+1
后两种情况其实是一种,就是接上一个尾巴,递增子序列长度+1
*/
import java.util.Arrays;
import java.util.Scanner;
public class 字符串的最长递增子序列 {
static int n;
static int[] b=new int[10009];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
while(n>0){
String s = sc.next();
Arrays.fill(b, 1);
int max=1;
for(int i=1;i<s.length();i++){
for(int j=0;j<i;j++){
if(s.charAt(j)<s.charAt(i)){
b[i]=Math.max(b[i],b[j]+1);
/*
if(b[i]>b[j]) b[i]=b[i];//因s[i]作为最大值
if(b[i]==b[j]) b[i]++;//因为我们可以把s[i]作为尾部即最大值放到s[j]后面,最长自增子序列长度+1
if(b[i]<b[j]) b[i]=b[j]+1;//我们让s[i]作为尾部即最大值,放到s[j]后面,最长自增子序列长度+1
*/
max=Math.max(max, b[i]);
}
}
if(b[i]>max) max=b[i];
}
System.out.println(max);
n--;
}
}
}