输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
解题思路:
dp[i] = j :表示以arr[i]结尾的最长上升子序列的长度是j。
dp[i] = max (dp[i] , dp[j]+1).
求长度:pre[i] = j :表示arr[i]的前一个数是arr[j].
Java代码:
import java.io.*;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] split = br.readLine().split(" ");
int []arr = new int[n + 1];
for(int i = 1; i <= n; i++) {
arr[i] = Integer.parseInt(split[i - 1]);
}
int []pre = new int[n + 1];//前序数组
int []dp = new int[n + 1];//dp[i]:表示以第arr[i]结尾的最长上升子序列的个数
for(int i = 1; i <= n; i++) {
dp[i] = 1;//开始时,arr[i]本身算一个
for(int j = 1; j <= i; j++)
if(arr[j] < arr[i])
if(dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
//当arr[i]之前的元素例如arr[j]小于arr[i]时,证明arr[j]可以加入到arr[i]之前,
//而加入到arr[i]时,最长的长度就是dp[j]+1,dp[j]表示到arr[j]为止,已经有dp[j]个长
//度了,将dp[j]+1的值与当前以arr[i]结尾的上升子序列最大值dp[i]比较,取两者的最大值
pre[i] = j;//表示 arr[i]的前一个数字是arr[j]
}
}
int max = dp[1], index = 1;
for(int i = 2; i <= n; i++) {
if(dp[i] > max) {
max = dp[i];
index = i;
}
}
ArrayList<Integer> ans = new ArrayList<>();
while(pre[index] != 0) {//找最终上升子序列
ans.add(arr[index]);
index = pre[index];
}
ans.add(arr[index]);
// for(int i = ans.size() - 1; i >= 0; i--) {//打印
// System.out.print(ans.get(i) + " ");
// }
System.out.println(max);
}
}