bzoj3357[Usaco2004]等差数列 DP

来源:互联网 发布:在ubuntu上下载软件 编辑:程序博客网 时间:2024/05/24 07:16

简单的dp,一开始处理复杂了。
明显设f[i][j]表示做到第i个差为j,然后有f[i][k]=(f[j][k]+1)
注意一下初值,因为是map所以初值在dp的时候才赋。
数组开大了RE了激发。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<map>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=2000*2000+5;map<int ,int>f[2005];int a[2005];int n,m,ans;int main(){    scanf("%d",&n);    fo(i,1,n)scanf("%d",&a[i]);    //sort(a+1,a+1+n);    if (n==1)    {        printf("1");        return 0;    }    fo(i,1,n)    {        fo(j,1,i-1)        {            int k=a[i]-a[j];            f[i][k]=max(max(f[i][k],f[j][k]+1),2);            ans=max(f[i][k],ans);        }    }    printf("%d\n",ans);}