题目链接:HDU - 5328
显然暴力的复杂度也是可以的,因为访问过的就不需要访问了。
但是其实有更简单的做法,就是直接dp,dp[i]表示以i结尾的最长等差数列。
等比数列同理。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define max(x,y) (x>y?x:y)
//#define int long long
using namespace std;
const int N=1e6+1;
int n,a[N],dp1[N],dp2[N],res;
char *fs,*ft,buf[1<<25];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){
int x=0,f=1; char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
inline void solve(){
n=read();
for(int i=1;i<=n;i++) a[i]=read(),dp1[i]=dp2[i]=2;
if(n==1){puts("1"); return;} res=2;
for(int i=3;i<=n;i++){
if(a[i-1]*2==a[i-2]+a[i]) dp1[i]=dp1[i-1]+1;
if(1LL*a[i-1]*a[i-1]==1LL*a[i-2]*a[i]) dp2[i]=dp2[i-1]+1;
res=max(res,max(dp1[i],dp2[i]));
}
printf("%d\n",res);
}
signed main(){
int T; T=read();
while(T--) solve();
return 0;
}