题目描述:给你n个数要求你挑出尽可能少的几个数使得前半部分递增后半部分递减
n<130
分析:看数据范围可以看出来肯定是直接暴力,暴力每个点往前能构成的最长子序列,和往后的最长递减子序列,
然后问题就是如何找最长递增(或递减)子序列, 考虑到一个最长子序列肯定是之前的最长子序列加一 所以记录下之前的就一定能找到后面的(非常像dp)
ac代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int a[105];
int al[105]={0},ar[105]={0};
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i]>a[j]) al[i]=max(al[i],al[j]+1);
}
}
for(int i=n;i>=1;i--)for(int j=n;j>i;j--) if(a[i]>a[j])
ar[i]=max(ar[i],ar[j]+1);
int ans=0;
for(int i=1;i<=n;i++) {
ans=max(ans,ar[i]+al[i]);
}
cout<<n-1-ans<<endl;
} 
京公网安备 11010502036488号