https://www.luogu.org/problemnew/show/P1091
题意就是求最长的先上升后下降的子序列(可以不上升也可以不下降)。
这道题给我个深刻的教训,好好看题!!好好看题!!原本理解错了,以为要对称的上升和下降,WA出一片天。
#include<bits/stdc++.h>
using namespace std;
int a[106],b[106],dp[106],d[106];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[n-1-i]=a[i];
dp[i]=d[i]=50000;
}
int ans=0;
for(int i=0;i<=n;i++)//n比较小,可以一个一个位置试试那个是中间的转折点。
{
for(int j=0;j<i;j++)
{
*lower_bound(dp,dp+i,a[j])=a[j];
}
for(int j=0;j<n-i;j++)
{
*lower_bound(d,d+n-i,b[j])=b[j];
}
int w=lower_bound(dp,dp+i,50000)-dp;
int e=lower_bound(d,d+n-i,50000)-d;
ans=max(w+e,ans);
for(int k=0;k<=n;k++)
{
dp[k]=d[k]=50000;
}
}
printf("%d\n",n-ans);
return 0;
}