https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1055&judgeId=593538
基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题
收藏
关注
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。
Input
第1行:N,N为正整数的数量(3 <= N <= 10000)。
第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)
Output
最长等差数列的长度。
Input示例
10
1
3
5
6
8
9
10
12
13
14
Output示例
5
emmm最长等差数列,老厉害了。感觉第一次遇到从中间向两边扫的动态规划。在爆栈的边缘试探,
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=10005;
using namespace std;
ll a[maxn];
short int dp[maxn][maxn];
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
cin>>a[i];
}
sort(a,a+t);
for(int i=0;i<t;i++)
for(int j=i+1;j<t;j++)
dp[i][j]=2;
int ans=2;
for(int i=t-2;i>=0;i--)
{
int k=i+1,q=i-1;
while(q>=0&&k<=t-1)
{
if(2*a[i]>a[k]+a[q])
{
k++;
}
if(2*a[i]<a[k]+a[q])
q--;
if(2*a[i]==a[k]+a[q])
{
dp[q][i]=dp[i][k]+1;
if(dp[q][i]>ans) ans=dp[q][i];
q--;
k++;
}
}
}
cout<<ans<<endl;
return 0;
}