求最长递增子序列的问题,不同的是正着反着要求两遍
动态规划 dp[i] 表示以第i个下标为结尾的最长递增子序列为多少
全部求出来后遍历一边数组,找到两个加起来最大的就可以了
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
int[] hi = new int[n];
for(int i = 0; i < n; i ++){
hi[i] = sc.nextInt();
}
int[] dp1 = new int[n], dp2 = new int[n];
for(int i = 0; i < n; i++){
for(int j = 0;j < i; j++){
if(hi[i] > hi[j])
dp1[i] = Math.max(dp1[i],dp1[j] + 1);
}
}
for(int i = n - 1; i >= 0; i--){
for(int j = n - 1;j > i; j--){
if(hi[i] > hi[j])
dp2[i] = Math.max(dp2[i],dp2[j] + 1);
}
}
int m = 0;
for(int i = 0; i < n; i++){
if(m < dp1[i] + dp2[i]){
m = dp1[i] + dp2[i];
}
}
System.out.print(n - m - 1);
}
}