【勘误】题目没说清楚,不一定严格的先增后减,单调增/减也可以
【思路】
求从0开始、以i结束的最长递增序列
求从i开始、以n结束的最长递减序列
再根据以上两个数组求出以k为分割点的最长合唱队形
最后减法得出最少出列个数
求从i开始、以n结束的最长递减序列
再根据以上两个数组求出以k为分割点的最长合唱队形
最后减法得出最少出列个数
#include<iostream> #include<math.h> using namespace std; int main(){ int n; int height[100]; int before[100],after[100],dp[100]; while(cin>>n){ for(int i=0;i<n;i++){ cin>>height[i]; } for(int i=0;i<n;i++){ before[i] = 0; after[i] = 0; } for(int i=0;i<n;i++){ before[i] = 0; for(int j=0;j<i;j++){ if(height[j]<height[i]){ before[i] = max(before[i],before[j]+1); } } } for(int i=n-1;i>=0;i--){ after[i] = 0; for(int j=n-1;j>i;j--){ if(height[j]<height[i]){ after[i] = max(after[i],after[j]+1); } } } int maxSelect = 0; for(int i=0;i<n;i++){ dp[i] = before[i]+after[i]+1; if(dp[i]>maxSelect) maxSelect = dp[i]; } cout<<n-maxSelect<<endl; } }