#include <iostream> #include<vector> using namespace std; //遍历每一位同学作为中心位置,对中心的左边部分求LIS,对右边部分求最长递减子序列,将两部分长度相加求和,最后我们取所有和中的最大值即可 //LIS问题:1,状态定义:dp[i]表示以s[i]结尾的LIS长度 2,转移方程:dp[i]=max(dp[j])+1,有j<i,并且s[j]<s[i](可以将s[i]作为结尾添加到以s[j]结尾的LIS中) 3,边界条件:dp[i]=1(至少长度为一); //LDS问题:和LIS问题的处理逻辑相同,dp[i]=max(dp[j])+1,有j<i,并且s[j]>s[i](可以将s[i]作为结尾添加到以s[j]结尾的LDS中) int main() { int num;//同学数量 cin>>num; vector<int>height(num,0);//记录同学的身高 for(int i=0; i<num; i++) cin>>height[i]; vector<int>LIS(num,1);//记录LIS长度 vector<int>LDS(num,1);//记录LDS长度 for(int i=1; i<num; i++)//遍历s[1]到s[num-1] { //遍历s[0]到s[i-1]求出左部分的LIS长度 for(int j=0; j<i; j++) { if(height[j]<height[i])//求LIS LIS[i]=max(LIS[i],LIS[j]+1); } } for(int i=num-2; i>=0; i--)//遍历s[num-2]到s[0](求LIS的逆过程) { //遍历S[num-1]到s[i+1]求右部分的LDS长度(逆向的LIS长度) for(int j=num-1; j>i; j--) { if(height[j]<height[i]) LDS[i]=max(LDS[i],LDS[j]+1); } } //求和的最大值 int maxsum=0;//LIS和LDS长度之和的最大值 for(int i=0; i<num; i++) maxsum=max(maxsum,LIS[i]+LDS[i]); //最后输出的是出列同学的数量不要搞错了 cout<<num-maxsum+1;//重复计算了一位 return 0; } // 64 位输出请用 printf("%lld")