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;
}