图片说明
先从前往后扫,再从后往前扫。

#include <iostream>
#include <cstring>
#include <math.h>

using namespace std;

const int N = 1001;

int height[N];
int dp[N];
int dp2[N];

int main(){
    int n;
    while(cin >> n){
        int maxh = 0;
        for(int i = 0; i < n; i++){
            cin >> height[i];
        }
        //int ans1 = 0;
        for(int i = 0; i < n; i++){
            dp[i] = 1;       //初始化
            for(int j = 0; j < i; j++){
                if(height[i] > height[j]){
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
        }
//         for(int i = 0; i < n; i++){
//             dp2[i] = 1;       //初始化
//             for(int j = 0; j < i; j++){
//                 if(height[i] < height[j]){
//                     dp2[i] = max(dp2[i], dp2[j] + 1);
//                 }
//             }
//         }
        int ans = 0;
        for(int i = n - 1; i >= 0; i--){
            dp2[i] = 1;
            for(int j = n - 1; j > i; j--){
                if(height[j] < height[i]){
                    dp2[i] = max(dp2[i], dp2[j] + 1);
                }
            }
            ans = max(ans, dp[i] + dp2[i] - 1);
        }
//         int ans = 0;
//         for(int i = 0; i < n; i++){
//             ans = max(ans, dp[i] + dp2[i] - 1);
//         }
        printf("%d\n", n - ans);
    }
    return 0;
}

被注释的部分是我的想法,只是单纯找到最长升序或者降序,而不是求一个数前边的最长升序和后边的最长降序。