P1091 合唱队形
为了保证中间的左边的尽可能多,右边的也尽可能多,所以选择dp[i] + dp2[i]总和 dp_all[ i ] 最大的【dp[i]+dp2[i] 加多一个自己】
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner (System.in); int N = sc.nextInt(); int arr[] = new int [N]; for(int i = 0 ; i < N ; i++) { arr[i] = sc.nextInt(); } int dp_all[] = new int[N]; int dp[] = new int[N]; int dp2[] = new int[N]; for(int i = 0; i < N; i++){ //求最长上升子序列 dp[i] = 1; for(int j = 0; j < i; j++){ if(arr[j] < arr[i] && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } } for(int i = N - 1; i >= 0; i--){ //从后往前求最长上升子序列 dp2[i] = 1; for(int j = N - 1; j > i; j--){ //用max函数就超时 if(arr[j] < arr[i] && dp2[i] < dp2[j] + 1) dp2[i] = dp2[j] + 1; } } int MAX = -1; for(int i = 0; i < N; i++){ dp_all[i] = dp[i] + dp2[i]; MAX = Math.max(MAX, dp_all[i]); } System.out.println(N-MAX+1); } }