NYOJ17单调递增最长子序列

描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0 随后的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;idp[j])
					j++;
				dp[j]=ch;
				if(j>max){
					max=j;
				}
			}			
			System.out.println(max+1);
			Arrays.fill(dp,'z');
			max=0;
		}
	}
}

你可能感兴趣的:(NYOJ)