题目描述
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位同学的身高(厘米)。
输出格式
一个整数,就是最少需要几位同学出列。
输入样例
8
186 186 150 200 160 130 197 220
输出样例
4
题解
最长上升子序列和最长下降子序列一起求即可。
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #define MAXN 102 using namespace std; int n; int a[MAXN]; int gq[MAXN]; // 不下降子序列 int lq[MAXN]; // 不上升子序列 int ans = 2147483647; int main() { scanf("%d", &n); for(register int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for(register int i = 1, m = 0; i <= n; i++, m = 0) { for(register int j = 1; j < i; j++) { if(a[i] > a[j] /* 判断第i个数是否大于第j个数,大于则第i个不下降子序列能继承第j个不下降子序列 */ && m < gq[j] /* 判断是否为目前最长的不下降子序列 */ ) m = gq[j]; } gq[i] = m + 1; } for(register int i = n, m = 0; i >= 1; i--, m = 0) { for(register int j = n; j > i; j--) { if(a[i] > a[j] /* 判断第i个数是否大于第j个数,大于则第i个不下降子序列能继承第j个不上升子序列 */ && m < lq[j] /* 判断是否为目前最长的不上升子序列 */ ) m = lq[j]; } lq[i] = m + 1; } for(register int i = 1; i <= n; i++) { if(n - gq[i] - lq[i] + 1 < ans) ans = n - gq[i] - lq[i] + 1; } printf("%d", ans == 2147483647 ? 0 : ans); return 0; }
参考程序
原文地址:https://www.cnblogs.com/kcn999/p/10804928.html
时间: 2024-11-05 16:08:04