http://tyvj.cn/p/1067
dp题,
从左往右做一次求最长上升子序列存在pre数组
从右往左做一次求最长上升子序列存在post数组
注意是最长上升子序列不是最长不下降子序列!
最长上升子序列是 t1<t2<t3<...<tn
最长不下降子序列是 t1<=t2<=t3<=...<=tn
然后枚举中间那个人Ti,最多存留人数是max{pre[ti]+post[ti]},最后 n-最多存留人数+1 即为答案。 加一是因为中间的人算了两次。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main ()
{
const int maxn = 100 + 5;
int n;
scanf("%d", &n);
int a[maxn];
for (int i=1;i<=n;i++) scanf("%d", &a[i]);
int pre[maxn], post[maxn];
pre[1] = 1;
for (int i=2;i<=n;i++)
{
pre[i] = 1;
for (int j=1;j<i;j++)
{
if (a[j]<a[i])
{
pre[i] = max(pre[i], pre[j]+1);
}
}
}
post[n] = 1;
for (int i=n-1;i>0;i--)
{
post[i] = 1;
for (int j=n;j>i;j--)
{
if (a[j]<a[i])
{
post[i] = max(post[i], post[j]+1);
}
}
}
int ans = 0;
for (int k=1;k<=n;k++)
ans = max(ans, pre[k]+post[k]);
printf("%d\n", n-ans+1);
return 0;
}