Description
给定n个数,从中拿走x(x>=0)个数,使剩下的数最有下列性质。
A1 < A2 < A3 <…At > At+1 >At+2 > … > As
问最少要抽掉几个数,此数列才会具有以上性质。
Input
一个数n (1<=n<=100),后面跟着n个正整数,表示这个数列。
Output
输出最少要抽掉几个数,此数列才会具有以上性质。
Sample Input
3 1 2 3
6 1 2 6 5 4 8
Sample Output
0
1
Hint
第一个案例中已经满足以上性质,所以就不用拿任何数,因而输出0
第二个案例拿走8就可以满足以上性质
Source
yygy
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int a[10010];
int dp1[10010],dp2[10010];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp1[i]=dp2[i]=1;
}
int sum=0;
for(int i=1;i<=n;i++)
for(int j=i-1;j>=1;j--)
if(a[i]>a[j] && dp1[j]+1>dp1[i])
dp1[i]=dp1[j]+1;
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
if(a[i]>a[j] && dp2[j]+1>dp2[i])
dp2[i]=dp2[j]+1;
for(int i=1;i<=n;i++)
{
if(dp1[i]+dp2[i]-1>sum)
sum=dp1[i]+dp2[i]-1;
}
printf("%d\n",n-sum);
}
}