3357: [Usaco2004]等差数列 DP+map

来源:互联网 发布:gta5离线模式需要网络 编辑:程序博客网 时间:2024/06/01 09:14

不知道正解是什么。。用map水一水。
fi,j表示到目前最后一位是i个倒数第二位是j的最长等差数列。
转移显然,判一下n=1的情况。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<set>#include<map>#define N 2005using namespace std;int n,ans,a[N];map<int,int> f[N];inline int read(){    int a=0,f=1; char c=getchar();    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}    return a*f;}int main(){    n=read();    if (n==1)    {        puts("1");        return 0;    }    for (int i=1;i<=n;i++)        a[i]=read();    for (int i=1;i<=n;i++)        for (int j=1;j<i;j++)        {            f[i][a[j]]=max(f[i][a[j]],2);            f[i][a[j]]=max(f[i][a[j]],f[j][2*a[j]-a[i]]+1);            ans=max(ans,f[i][a[j]]);        }    cout << ans << endl;}
0 0
原创粉丝点击