您的位置:首页 > 其它

NYOJ17单调递增最长子序列

2017-03-30 19:11 295 查看
描述

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

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

输入

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

随后的n行,每行有一个字符串,该字符串的长度不会超过10000

输出

输出字符串的最长递增子序列的长度

样例输入

3

aaa

ababc

abklmncdefg

样例输出

1

3
7

经典动态规划,关于该题解法在刘汝佳《算法竞赛入门经典训练指南》动态规划部分中有详细讲解。

本题中初始化一个dp数组。首先需要确认在同样长度的递增序列时,最后一个字符最小的序列为最优序列。因为在循环到下一个字符时,最后一个字符最小的序列最有可能继续增长。所以在dp数组的每个元素中存入到当前循环位置为止,长度为数组下标的递增序列中最小的最后一个字符。显然该数组为一个递增数组。每次循环到一个新的位置时,用二分法查找小于当前元素的最大位置后插入。此外,博主将dp数组全部初始化为z。在该题中不使用二分插入也可以ac该题。

/*nyoj17 唐小晨000 2016-7-25*/
package Practice;
import java.util.Arrays;
import java.util.Scanner;

public class _0017单调递增最长子序列{
public static void main(String[]args){
int num;
int size;
int max=0;
String str;
char[]dp=new char[26];
Arrays.fill(dp,'z');
//初始化数组为z
Scanner in=new Scanner(System.in);
num=in.nextInt();
in.nextLine();
for(int i=0;i<num;i++){
str=in.nextLine();
size=str.length();
for(int x=0;x<size;x++){
char ch=str.charAt(x);
int j=0;
while(ch>dp[j])
j++;
dp[j]=ch;
if(j>max){
max=j;
}
}
System.out.println(max+1);
Arrays.fill(dp,'z');
max=0;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: