nyoj17 单调递增最长子序列
题目描述
单调递增最长子序列
时间限制: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
版权声明:本文为博主原创文章,未经博主允许不得转载。