题目链接
思路:这个题有点难想的是dp的状态,dp【i】【j】代表子序列最后一个数是i,倒数第二个为j的长度。dp过程中用pos记录前一个相等的数的位置
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e3+1;
int n,a[maxn],dp[maxn][maxn],ans=1;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
int pos=-1;
for(int j=1;j<i;++j)
{
if(pos==-1) dp[i][j]=2;
else dp[i][j]=dp[j][pos]+1;
if(a[i]==a[j]) pos=j;
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}