https://codeforces.com/gym/102082
题意
给定一些数,可以重新排序,求其中最长的等差数列的长度
思路
d[i][j]表示以a[i]和a[j]为开头的等差数列的最大长度,具体见代码
1 #define bug(x,y) cout<<"i="<<x<<": "<<y<<endl 2 #define IO std::ios::sync_with_stdio(0); 3 #include <bits/stdc++.h> 4 #define itor ::iterator 5 using namespace std; 6 typedef long long ll; 7 typedef pair<ll,ll>P; 8 #define pb push_back 9 #define se second 10 #define fi first 11 #define rs o*2+1 12 #define ls o*2 13 const int N=5e3+5; 14 int n; 15 int a[N],d[N][N]; 16 int main(){ 17 scanf("%d",&n); 18 for(int i=1;i<=n;i++){ 19 scanf("%d",&a[i]); 20 } 21 sort(a+1,a+1+n); 22 for(int i=1;i<=n;i++){ 23 for(int j=1;j<=n;j++)d[i][j]=2; 24 } 25 int ans=2; 26 for(int i=n-1;i>=2;i--){ 27 int j=i-1,k=i+1; 28 while(j>=1&&k<=n){ 29 if(a[j]+a[k]==2*a[i]){ 30 d[j][i]=d[i][k]+1; 31 ans=max(ans,d[j][i]); 32 j--;k++; 33 } 34 else if(a[j]+a[k]<2*a[i]){ 35 k++; 36 } 37 else if(a[j]+a[k]>2*a[i]){ 38 j--; 39 } 40 } 41 } 42 printf("%d\n",ans); 43 }
原文地址:https://www.cnblogs.com/ccsu-kid/p/10599443.html
时间: 2024-10-08 11:30:53