子数列 acm at BUPT 1004

这个问题:

 

Description
现在有一个数列,需要你求得该数列满足下述要求的最长子数列。子数列要求:这个子数列可以被分成前后两个部分,且两部分共同拥有一个数列项(即前一部分的最后一个数列项和后一部分的第一个数列项是同一个数列项);子数列的前一部分各项要严格递增,后一部分各项要严格递减。例如,数列 1 4 6 5 2 1 可以分成 1 4 6 和 6 5 2 1 这两部分。他们都含有数列项 6 ,且前者各项严格递增,后者各项严格递减。


请你编写程序回答,对一个数列最少剔除几项,就可使剩下的各项组成的子数列满足上述的要求。


Input
输入数据有若干组。每组的第一行为整数 n (1 <= n <= 50) 表示数列的项数,第二行的 n 个整数即为该数列的各项,范围 1 到 1000000000 。

Output
输出最少需要剔除数列中的几项。一个结果一行。

Sample Input

6
1 4 6 5 2 1
5
2 2 2 2 2


Sample Output

0
4


Hint
不明白输入输出方法的同学请看:
使用标准输入cin,cout,scanf,printf即可,不用读文件。数据读入一组,处理一组,输出一组。

 

为什么我老是wrong answer呢?

 

我的输入输出明明自己调试的时候是正确的。。。

 

本来我以为要用双重循环,结果单重循环就搞定了。就跟kmp算法一样,在对比的时候如果 1 2 3 4 3 1 已经对比过了,那么2 3 4 3 1、

3 4 3 1、 4 3 1、 3 1、 1 就不用再对比了。就跟回文是类似的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值