一、题目
二、实现(动态规划)
将数组中的每一个元素依次作为结尾元素,遍历该结尾元素前的所有元素,查找比结尾元素小的元素,如果小则递增子序列的长度加1(长度初始为1,其本身)
import java.util.Scanner;
public class Test{
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n];
for(int i=0;i<n;i++) {
a[i] = sc.nextInt();
}
int dp[] = new int[n];
dp[0]=1; // 以第一个元素结尾的子序列中,最大递增序列长度为1
int res = 1; //记录结果
for(int i=1;i<n;i++) {//依次作为结尾元素
dp[i] = 1;
// 计算以a[i]结尾的序列中,所有元素中最大的递增子序列长度
for(int j=i-1;j>=0;j--) { //依次与前面元素比较(寻找比a[i]小的元素)
if(a[j]<a[i]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
res = Math.max(dp[i], res);
}
System.out.println(res);
}
}
class Solution {
public int lengthOfLIS(int[] a) {
int n = a.length;
int dp[] = new int[n];
dp[0]=1;
int res = 1;
for(int i=1;i<n;i++) {//依次作为结尾元素
dp[i] = 1;
// 计算以a[i]结尾的序列中,所有元素中最大的递增子序列长度
for(int j=i-1;j>=0;j--) { //依次与前面元素比较(寻找比a[i]小的元素)
if(a[j]<a[i]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
res = Math.max(dp[i],res);
}
return res;
}
}