描述
n 位同学站成一排,音乐老师要请其中的 n−k 位同学出列,使得剩下的 k 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 k 位同学从左到右依次编号为 1,2, … ,k,他们的身高分别为 t1,t2, … ,tk,则他们的身高满足 t1<⋯<ti>ti+1> … >tk(1≤i≤k)。
你的任务是,已知所有 n 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入描述
共二行。
第一行是一个整数 n(2≤n≤100),表示同学的总数。
第二行有 n 个整数,用空格分隔,第 i 个整数 ti(130≤ti≤230)是第 i 位同学的身高(厘米)。
输出描述
一个整数,最少需要几位同学出列。
思路
从前向后走一遍动态规划计算严格升序序列,从后向前走一遍计算严格升序序列。 最后再遍历一遍其两者和最大的数,然后拿总数减去就是答案。
AC代码:
//从前向后走一遍动态规划计算严格升序序列,从后向前走一遍计算严格升序序列。 //最后再遍历一遍其两者和最大的数,然后拿总数减去就是答案。 #include <bits/stdc++.h> using namespace std; const int maxn = 100+10; int N; int a[maxn]; int dp_zuo[maxn]; int dp_you[maxn]; int main() { cin>>N; for (int i=1;i<=N;i++) { cin>>a[i]; } for (int i=1;i<=N;i++) { dp_zuo[i] = 1; for (int j=1;j<i;j++) { if (a[i]>a[j]) { dp_zuo[i] = max(dp_zuo[i], dp_zuo[j]+1); } } } for (int i=N;i>=1;i--) { dp_you[i] = 1; for (int j=i+1;j<=N;j++) { if (a[i]>a[j]) { dp_you[i] = max(dp_you[i], dp_you[j]+1); } } } int max_people = 0; for (int i=1;i<=N;i++) { max_people = max(max_people, dp_zuo[i]+dp_you[i]-1); } cout<<N-max_people; return 0; }