添加链接描述
补题B:本题求最长等差序列的长度
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<algorithm>
#include<sstream>
#include<memory>
#include<functional>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
#define ll long long int
const int INF = 0x3f3f3f3f;
int js[5050],dp[5050][5050];
int main()
{
int t;
scanf("%d",&t);
for(int i=0;i<t;++i)
{
scanf("%d",&js[i]);
}
sort(js,js+t);
int max1=0;
for(int i=0;i<t;++i)
{
int k=i-1;
for(int j=i+1;j<t;++j)//从最小间隔为1开始(i!=j)
{
dp[i][j]=2;//设置最小长度为2
int d=js[j]-js[i];//等差序列的差
while(k>=0&&js[i]-js[k]<d)//k未到左边界且i到k的距离小于d,k可以向左边伸展
k--;
if(k==-1||js[i]-js[k]!=d)//k比左边界还要左或者在上一步的伸展以后还不等于d
continue;
dp[i][j]=max(dp[i][j],dp[k][i]+1);//如果满足条件就加一然后继续向右,k表示i前面的某个数js[k]的下标
max1=max(max1,dp[i][j]);//取最长的长度
}
}
printf("%d",max1==0?2:max1);
return 0;
}