nefu 179 珠子(最长递增子序列问题)

时间:2022-09-11 12:54:14

Description

小林有一串珠子,是由很多个大小不同的珠子串联在一起组成的圆环型的,且其中每个珠子的大小可以用int型的整数来表示。小林有一个爱好就是数珠子,他想数那些位置相邻而且大小只相差1的珠子组成单调递增或单调递减的最长串是多长,比如说现在他有5个珠子,大小分别为2 3 4 9 22,那么这串珠子最长的符合要求的串的长度为3,而如果是 3 4 3 9 22 这个的话那么最长的有两条,3 4 和 4 3,但是长度相同答案为2。

Input

数据有多个样例,每个样例的第一行给出一个n(0< n < 10),代表这串珠子的总长度(珠子是圆环型的首尾相连的),接着第二行给出n个数字,代表这n个珠子的大小。

Output

请输出这串珠子中最长的符合要求的子串的长度

Sample Input

5
2 3 4 9 22
5
3 4 9 22 2
5
3 4 3 9 22

Sample Output

3
3
2 // 注意题意,珠子是首尾相连的
//max()函数
#include <iostream>
#include <cmath>
using namespace std; int main()
{
int data[],lp_1[],lp_2[];
int n,ans_1,ans_2,ans;
while(cin>>n)
{
lp_1[]=;lp_2[]=;
for(int i=;i<n;i++)
cin>>data[i];
for(int i=;i<n;i++)
data[i+n]=data[i];
for(int i=;i<*n;i++)
{
lp_1[i]=;
lp_2[i]=;
for(int j=;j<i;j++)
{
if(data[i]-data[j]==&&lp_1[j]+>lp_1[i])
lp_1[i]=lp_1[j]+;
if(data[j]-data[i]==&&lp_2[j]+>lp_2[i])
lp_2[i]=lp_2[j]+;
}
}
ans_1=lp_1[];
ans_2=lp_2[];
for(int i=;i<*n;i++)
{
ans_1=max(ans_1,lp_1[i]);
ans_2=max(ans_2,lp_2[i]);
}
//cout<<ans_1<<" "<<ans_2<<endl;
ans=max(ans_2,ans_1);
cout<<ans<<endl;
}
return ;
}