题目描述:
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式:
第一行包含整数N。 第二行包含N个整数,表示完整序列。
输出格式:
输出一个整数,表示最大长度。
数据范围:
1≤N≤1000,
−10^9≤数列中的数≤10^9
输入样例:
7
3 1 2 1 8 5 6输出样例:
4
设计状态:
设f(x)为以a[x]结尾的LIS长度,那么LIS = max{f(x)}
如何推导f(x),f(x)从哪里来?
考虑比x小的每一个p,如果a[x] > a[p],那么f(x) = f(p) + 1
状态转移方程:
f(x) = max{f(p)} + 1
(p < x, a[p] < a[x])
import java.util.Scanner;
public class Main{
static int N = 1010;
static int[] a = new int[N];
static int[] f = new int[N];//最长上升子序列
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
int n = read.nextInt();
for(int i = 1; i <= n; i++) a[i] = read.nextInt();
for(int i = 1; i <= n; i++) {
f[i] = 1;
for(int j = 1; j < i; j++) {
if(a[i] > a[j]) f[i] = Math.max(f[i], f[j]+1);
}
}
int res = 0;//遍历,求最大值
for(int i = 1; i <= n; i++) {
res = Math.max(res, f[i]);
}
System.out.println(res);
}
}