3357: [Usaco2004]等差数列|DP

map水题大法好

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define inf 1e60
#define ll long long
#define N 2002
using namespace std;
int sc()
{
    int i=0,f=1; char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
    return i*f;
}
map<int,int>mp[N];
int a[N],n,ans;
int main()
{
    n=sc();
    for(int i=1;i<=n;i++)
    {
        a[i]=sc();
        for(int j=1,k;j<i;j++)
            k=a[i]-a[j],ans=max(ans,mp[i][k]=max(mp[i][k],mp[j][k]+1));
    }
    cout<<ans+1;
    return 0;
}

你可能感兴趣的:(dp)