3357: [Usaco2004]等差数列
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 485 Solved: 226
[ Submit][ Status][ Discuss]
Description
约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7”
很容易看出“1,3,5,7”是等差数列.
给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度.
Input
第1行:一个整数N.
第2到N+1行:每行一个整数Ai,表示牛的号码.
Output
最长等差数列的长度.
Sample Input
5
1
4
3
5
7
Sample Output
4
dp[i][j]表示以第i个数结尾,公差为j的最长等差序列
因为差可能很大,所以要用map,复杂度O(n²logn)
#include<stdio.h>
#include<map>
#include<algorithm>
using namespace std;
map<int, int> dp[2005];
int a[2005];
int main(void)
{
int n, i, j, ans;
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
ans = 1;
for(i=1;i<=n;i++)
{
for(j=1;j<=i-1;j++)
{
dp[i][a[i]-a[j]] = max(dp[i][a[i]-a[j]], max(dp[j][a[i]-a[j]]+1, 2));
ans = max(ans, dp[i][a[i]-a[j]]);
}
}
printf("%d\n", ans);
return 0;
}