文章

2

粉丝

0

获赞

12

访问

486

头像
合唱队形 题解:双向dp,封装好的函数int biLIS(vector<int>& num)
P1253 北京大学机试题
发布于2026年2月9日 12:49
阅读数 182

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int biLIS(vector<int>& num) {
    int n=num.size();
    if (n<=1)return n;
    vector<int> inc(n,1),dec(n,1);
    // 正向dp
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < i; j++) 
            if (num[j] < num[i]) 
                inc[i] = max(inc[i], inc[j] + 1);
    // 反向dp
    for (int i = n - 1; i >= 0; i--) 
        for (int j = n - 1; j > i; j--) 
            if (num[j] < num[i]) 
                dec[i] = max(dec[i], dec[j] + 1);
    int maxlen = 0;
    for (int i=0;i<n;i++){
        int len=inc[i]+dec[i]-1;
        maxlen=max(maxlen,len);
    }
    return maxlen;
}

int main(){
	int N;
	while(cin>>N){
		vector<int> num(N);
		for(int i=0;i<N;i++)
			cin>>num[i];
		int rest=biLIS(num);
		cout<<N-rest<<'\n';
	}
	return 0;
}

双向dp,然后找以同一个位置结尾的最长递增子列和最长递减子列,它们的长度之...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发