大意:
输出其中最长的等差(AP)或等比(GP)数列的长度。
数列长度为1或2时一定是等比或等差数列。
如果a,b,c是AP或GP,b,c,d是AP或GP那么a,b,c,d是AP或GP。
因此有状态转移方程。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <memory.h>
#define eps 1e-6;
using namespace std;
int a[1000005];
int max1=2;
int ap[1000005];
int gp[1000005];
void solve(int n)
{
ap[0]=2;
ap[1]=2;
gp[0]=2;
gp[1]=2;
for(int i=2; i<n; i++)
{
ap[i]=2;
gp[i]=2;
if(a[i-1]*2==a[i-2]+a[i])
{
ap[i]=ap[i-1]+1;
if(ap[i]>max1)
max1=ap[i];
}
if(fabs(a[i]*1.0/a[i-1]-a[i-1]*1.0/a[i-2])<1e-6)
{
gp[i]=gp[i-1]+1;
if(gp[i]>max1)
max1=gp[i];
}
}
}
int main()
{
int n,T;
memset(a,0,sizeof(a));
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
if(n==1||n==2)
{
printf("%d\n",n);
}
else
{
max1=2;
solve(n);
printf("%d\n",max1);
}
}
return 0;
}