解题思路: 这道题关键点在于求每个人左右两边最大留住的人数。拿每个人左边为例,每个人左边的人身高必须比这个人要小,按这个逻辑这个人左边的每一个人都有其最大的留住人数max,然后求左边每个人的max里的最大值加1,加1是因为要把左边符合逻辑的人包含在内。 右边的逻辑同理。 动态规划我的理解就是把复杂的问题分解成逻辑相同的原子问题,然后原子问题堆积成原有问题。难点在于对复杂问题的分析,怎样抽象出原子问题是动态规划的难点。

#include<vector>
using namespace std;
int main(){
    vector<int> num;
    int n=0,number=0;
    int i=0,j=0,min=0;
    int * left;
    int * right;
    while(cin>>n){
        min=n+1;
        left=new int[n]{0};
        right=new int[n]{0}; 
        for(i=0;i<n;i++){
            cin>>number;
            num.push_back(number);
        }
        /*计算左边最大的人数*/
        for(i=0;i<n;i++){
            for(j=0;j<i;j++){
                if(num[j]<num[i]){
                    if(left[j]>=left[i]){
                        left[i]=left[j]+1;
                    }
                }
            }

        }
        /*计算右边最大的人数*/
        for(i=n-1;i>=0;i--){
            for(j=n-1;j>i;j--){
                if(num[j]<num[i]){
                    if(right[j]>=right[i]){
                        right[i]=right[j]+1;
                    }
                }
            }  
        }
        /*计算出列最少的人数*/
        for(i=0;i<n;i++){
            j=n-left[i]-right[i]-1;
            if( j<min)
                min=j;
        }
        cout<<min<<endl;
        delete []left;
        delete []right;
        num.clear();
    }
    return 0;
}