import java.util.*;
class Main{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
int[]dp = new int[1010];
int[]arr = new int[1010];
int n = sc.nextInt();
for(int i = 1; i <= n; i++){
dp[i] = arr[i] = sc.nextInt();
}
for(int i = 2; i <= n; i++){
for(int j = 1; j < i; j++){
if(arr[j] < arr[i]){
dp[i] = Math.max(dp[i],dp[j]+arr[i]);
}
}
}
int ans = -1;
for(int i = 1; i <= n; i++){
ans = Math.max(ans,dp[i]);
}
System.out.println(ans);
}
}
时间复杂度O(n方)
importjava.util.*;classMain{publicstaticvoidmain(String[] args){Scanner sc =newScanner(System.in);int n = sc.nextInt();int[] arr =newint[n];for(int i =0; i < n; i++){
arr[i]= sc.nextInt();}int[] dp =newint[n];Arrays.fill(dp,1);int res =1;for(int i =0; i < n; i++){for(int j =0; j < i; j++){if(arr[j]<arr[i]){
dp[i]=Math.max(dp[i],dp[j]+1);}}
res =Math.max(res,dp[i]);}System.out.println(res);}}
二分做到O(nlogn)
importjava.util.*;classMain{staticintN=(int)1e5+10;staticint[] p =newint[N], dp =newint[N];staticint len =1;staticintfind(int x){int l =1, r = len;while(l < r){int mid =(l+r)>>1;if(dp[mid]>= x){
r = mid;}else{
l = mid+1;}}return r;}publicstaticvoidmain(String[] args){Scanner sc =newScanner(System.in);int n = sc.nextInt();for(int i =1; i <= n;i++){
p[i]= sc.nextInt();}
dp[1]= p[1];for(int i =2; i <= n; i++){if(p[i]> dp[len]){
dp[++len]= p[i];}else{int j =find(p[i]);
dp[j]= p[i];}}System.out.println(len);}}
记录最早满足的路径
importjava.util.*;publicclassSolution{/**
* retrun the longest increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型一维数组
*/int[]dp,tmp;int len =0;intfind(int x){int l =0, r = len;while(l < r){int mid =(l+r)>>1;if(dp[mid]>= x ){
r = mid;}else{
l = mid+1;}}return l;}publicint[] LIS (int[] arr){// write code hereint n = arr.length;
dp =newint[n];
tmp =newint[n];
dp[0]= arr[0];
tmp[0]=0;for(int i =1; i < n; i++){if(arr[i]> dp[len]){
dp[++len]= arr[i];
tmp[i]= len;}else{int j =find(arr[i]);
dp[j]= arr[i];
tmp[i]= j;}}int[] ans =newint[len+1];for(int i = n-1; i >=0; i--){if(tmp[i]== len){
ans[len--]= arr[i];}}return ans;}}
TOC补充最大上升子序列和import java.util.*;class Main{ public static void main(String[]args){ Scanner sc = new Scanner(System.in); int[]dp = new int[1010]; int[]arr = new int[1010]; int n = sc.nextInt(); for(int i = 1;