解题思路:
使用dp数组记录每个元素的最长子序列长度,遍历元素i前面大于它的,将其中最大的dp数加1赋给dp[i],完成后记录的最大的dp数即为最长子序列长度。反向遍历后逆序输出即可
package Algorithms;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class LCS {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[10];
//记录每个元素的最长子序列长度
int[] dp = new int[10];
//记录最大长度
int ans = 0;
ArrayList<Integer> v = new ArrayList<>();
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
dp[i] = 1;
}
// 动态规划求解最长递减子序列
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
//找到在i之前大于a[i]的元素,并将其最大的dp数加1赋给dp[i]
if (a[i] < a[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
ans = Math.max(ans, dp[i]);
}
// 通过dp数组反向构建最长递减子序列
int temp = ans;
while (temp > 0) {
n--;
if (dp[n] == temp) {
v.add(a[n]);
temp--;
}
}
// 由于是反向构建的序列,需要逆序输出
Collections.reverse(v);
// 输出结果
System.out.println(ans);
for (int it : v) {
System.out.print(it + " ");
}
}
}