您的位置:首页 > 其它

最长上升下降子序列

2013-08-16 12:21 309 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: