BZOJ 3357: [Usaco2004]等差数列 动态规划
Code:
#include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 2003 using namespace std; map<int,int>k; int arr[maxn],f[maxn][maxn]; int main() { // setIO("input"); int n,ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&arr[i]); if(n==1) { printf("1\n"); return 0; } for(int i=1;i<n;++i) f[i][n]=2; k[arr[n]]=n; for(int j=n-1;j>1;--j) { for(int i=1;i<j;++i) { f[i][j]=2; int to=arr[j]+arr[j]-arr[i]; if(k[to]) { f[i][j]=max(f[i][j], f[j][k[to]] + 1); } ans=max(f[i][j], ans); } k[arr[j]]=j; } printf("%d\n",ans); return 0; }