文章
2
粉丝
0
获赞
12
访问
486
#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,然后找以同一个位置结尾的最长递增子列和最长递减子列,它们的长度之...
登录后发布评论
暂无评论,来抢沙发