链接:点击打开链接
题意:N个不同的正整数,找出由这些数组成的最长的等差数列
例如:1 3 5 6 8 9 10 12 13 14
等差子数列包括(仅包括两项的不列举)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14
其中6 8 10 12 14最长,长度为5
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[10005];
short dp[10005][10005];
int main(){
int n,i,j,k,ans;
while(scanf("%d",&n)!=EOF){ //dp[i][j]为以a[i]和a[j]结尾的最长
ans=1; //等差数列
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(i=1;i<n;i++){
j=i-1,k=i+1;
while(j>=0&&k<n){
if(a[j]+a[k]>2*a[i])
j--;
else if(a[j]+a[k]<2*a[i])
k++;
else{
if(dp[j][i]==0) //第一次相当于初始化
dp[j][i]=dp[i][k]=3;
else //可以理解为结尾的方向不同
dp[j][i]=dp[i][k]=dp[j][i]+1;
ans=max(ans,(int)dp[i][k]);
j--,k++;
}
}
}
printf("%d\n",ans);
}
return 0;
}