【勘误】题目没说清楚,不一定严格的先增后减,单调增/减也可以
【思路】
求从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;
}
}

京公网安备 11010502036488号