合唱队形
合唱队形
题目概述:有n个同学,需要从中挑选n - k个学生。使得剩下的学生依据升高按照先递增后递减的规则进行排队。问最少需要排除多少个人。
解题思路:换个说法,题目意思就是使这个队列尽可能的长,所以排除的人就尽可能少。而这样的话,就转化为登山问题。
点击查看代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
#include <vector>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N = 1010;
int h[N];
int f[N],g[N];
void solve(){
int n;
cin >> n;
for(int i = 1; i <= n; i ++)cin >> h[i];
int res = 0;
for(int i = 1; i <= n; i ++){
f[i] = 1;
for(int j = 1; j < i; j ++){
if(h[j] < h[i])f[i] = max(f[i],f[j] + 1);
}
}
for(int i = n; i >= 1; i --){
g[i] = 1;
for(int j = n; j > i; j --){
if(h[j] < h[i])g[i] = max(g[i],g[j] + 1);
}
}
for(int i = 1; i <= n; i ++)res = max(res,f[i] + g[i] - 1);
cout << n - res << endl;
}
int main(){
int T = 1;
while(T --){
solve();
}
}
浙公网安备 33010602011771号