HDU - 5328

题目链接: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;
}
发布了716 篇原创文章 · 获赞 244 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104783209
hdu
今日推荐