合唱队形
题目描述
输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。
第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。
输入描述
输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。
第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。
输出描述
可能包括多组测试数据,对于每组数据,
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
#include<iostream>
using namespace std;
const int maxn=100;
int arr[maxn];
int dp1[maxn];
int dp2[maxn];
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<n;i++){
dp1[i]=1;
for(int j=0;j<i;j++){
if(arr[j]<arr[i]){
dp1[i]=max(dp1[i],dp1[j]+1);
}
}
}
for(int i=n-1;i>=0;i--){
dp2[i]=1;
for(int j=n-1;j>i;j--){
if(arr[j]<arr[i]){
dp2[i]=max(dp2[i],dp2[j]+1);
}
}
}
int answer=n;
for(int i=0;i<n;i++){
answer=min(answer,n-dp1[i]-dp2[i]+1);
}
cout<<answer<<endl;
}
}
核心要点
相当于最长公共子序列的加强版,需要求出双向序列,然后用总数减去两边看怎样才能使得更少的人出去