文章
211
粉丝
0
获赞
1048
访问
35.2k
/*
思路:题目要求中间最高 则设置2个dp数组
dp1从左往右遍历 记录从左往右的最大队列长度
dp2从右往左遍历 记录从右往左的最大队列长度
两个数组遍历结束后 从头开始遍历比较
最大的队列长度为dp1[i]+dp2[i]-1 因为i的位置在两个dp数组中各记录了一次
将结果记录为maxx 此时maxx为最大队列长度
而题目所求是需要最少同学出列 故出列同学数量等于总同学数量-最大队列长度 即n-maxx
*/
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin >> n){
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
vector<int> dpl(n,1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (a[j] < a[i]) { // 从左到i满足上升条件
dpl[i] = max(dpl[i], dpl[j] + 1);
}
}
}
vector<int> dpr(n,1);
for (int i = n-2; i >= 0; i--) {
for (int j = n-1; j > i; j--) {
if (a[j] < a[i]) { // 从右到i满足上升条件
dpr[i] = max(dpr[i], dpr[j] + 1);
}
}
}
int maxL = 0;
for (int i = 0; i < n; i++){
maxL = max(dpl[i] + dpr[i] - 1,maxL);
}
cout << n - maxL &l...
登录后发布评论
暂无评论,来抢沙发