1249: 最长上升子序列
时间限制: 1 Sec 内存限制: 128 MB
提交: 1250 解决: 887
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入
第一行包含整数N(1≤N≤1000),
第二行包含N个整数,表示序列a,−1e9≤a[i]≤1e9 。
输出
输出一个整数,表示最大长度。
样例输入 Copy
7
3 1 2 1 8 5 6
样例输出 Copy
4
来源/分类
动态规划
import java.util.Scanner;
//1249
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] nums = new int[N];
for (int i = 0; i < N; i++) {
nums[i] = scanner.nextInt();
}
System.out.println(lengthOfLIS(nums));
}
public static int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
int len = 0;
for (int num : nums) {
int i = 0, j = len;
while (i < j) {
int mid = i + (j - i) / 2;
if (dp[mid] < num) {
i = mid + 1;
} else {
j = mid;
}
}
dp[i] = num;
if (i == len) {
len++;
}
}
return len;
}
}