文章

211

粉丝

0

获赞

1048

访问

35.2k

头像
合唱队形 题解:
P1253 北京大学机试题
发布于2026年3月7日 11:16
阅读数 373

/*
思路:题目要求中间最高 则设置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...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发