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);
}
}
全部评论

相关推荐

10-31 14:54
已编辑
门头沟学院 算法工程师
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务