51nod 1055 最长等差数列

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1055

题意:

思路:
先固定一个位置,然后从该中心点出发向两边扫,确实很难想到啊。。。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 typedef long long ll;
13 typedef pair<int,int> pll;
14 const int INF = 0x3f3f3f3f;
15 const int maxn=10000+5;
16 
17 int n;
18 
19 short int dp[maxn][maxn];
20 int a[maxn];
21 
22 int main()
23 {
24     //freopen("in.txt","r",stdin);
25     while(~scanf("%d",&n))
26     {
27         memset(dp,0,sizeof(dp));
28         for(int i=1;i<=n;i++)  scanf("%d",&a[i]);
29         sort(a+1,a+1+n);
30         for(int i=1;i<=n;i++)
31             for(int j=i+1;j<=n;j++)
32             dp[i][j]=2;
33 
34         int ans=2;
35         for(int i=n-1;i>1;i--)
36         {
37             int l=i-1,r=i+1;
38             while(l>0 && r<=n)
39             {
40                 if(a[l]+a[r]>2*a[i])  l--;
41                 else if(a[l]+a[r]<2*a[i])  r++;
42                 else
43                 {
44                     dp[l][i]=dp[i][r]+1;
45                     if(dp[l][i]>ans)  ans=dp[l][i];
46                     l--;r++;
47                 }
48             }
49         }
50         printf("%d
",ans);
51     }
52     return 0;
53 }
原文地址:https://www.cnblogs.com/zyb993963526/p/7617164.html