您的位置:首页 > 编程语言 > Java开发

nyoj17 单调递增最长子序列

2013-06-28 22:02 369 查看

题目描述


单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4

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

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

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

随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg


样例输出
1
3
7


解答

import java.util.Scanner;
/**
* 动规
* @author Administrator
*
*/
public class n017_单调递增最长子序列 {

public static void main(String[] args) {
String[] ss=getInput();
for(String s: ss){
//输出字符串的最长递增子序列的长度
System.out.println(findMax(s));
}
}
/**
* 接收输入
* 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
* @return
*/
public static String[] getInput(){
Scanner scan=new Scanner (System.in);
String[] ss=new String[scan.nextInt()];
for(int i=0;i<ss.length;i++){
ss[i]=scan.next();
}
return ss;
}
/**
* 寻找单调递增最大长度
* @param s
* @return
*/
public static int findMax(String s){
//存放长度
int[] nums=new int[s.length()];

for(int i=0;i<s.length();i++){
int c1=s.charAt(i);
int temp=0;
for(int j=i;j>=0;j--){
if(c1>s.charAt(j)){
if(nums[j]>temp)
temp=nums[j];
}
}
//前面已经包含的最大字符长度加上本身的长度就等于
//  这个字符的最大长度
nums[i]=temp+1;
}
//找到最大长度
int max=0;
for(int i:nums){
if(i>max)
max=i;
}
return max;
}
}


本题已AC

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=17
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nyoj java