2757:最长上升子序列
package bailian;
import java.util.Arrays;
import java.util.Scanner;
/**
* 描述
* 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).
*
* 你的任务,就是对于给定的序列,求出最长上升子序列的长度。
* 输入
* 输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
* 输出
* 最长上升子序列的长度。
*/
public class Demo02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String line = sc.nextLine();
String[] nums = line.split(" ");
int[] numsArr = new int[n];
for (int i = 0; i < n; i++) {
numsArr[i] = Integer.parseInt(nums[i]);
}
int[] maxLength = new int[n];//存储节点为k的时候的最长上升子序列的长度
//状态转换方程如下:
//k=0时 maxLength[0] = 1
//k=1,2,3...时。maxlength = maxLength[i] + 1(0<i<k,nums[i]<nums[k]) 如果找不到则为1
maxLength[0] = 1;
for (int i = 1; i < n; i++) {
int maxLen = 1;
for (int j = 0; j < i; j++) {
if (numsArr[j]<numsArr[i]) {
int maxLenTemp = maxLength[j] + 1;
if (maxLenTemp > maxLen) {
maxLen = maxLenTemp;
}
} else {
if (maxLen < 1) {
maxLen = 1;
}
}
}
maxLength[i] = maxLen;
}
int maxlength = maxLength[0];
for (int i : maxLength) {
if (i > maxlength) {
maxlength = i;
}
}
System.out.println(maxlength);
}
}