这道题感觉朴素点就行了,不必想的太复杂(枚举最后2个)
dp思想:设a1,a2...ai,aj;则以ai,aj为结尾的数列必定是以ax,ai(x<i&&ai-ax=aj-ai)转移来的,满足dp无后效性和最优子结构
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int n;
int w[110];
int dp[110][110];
int ml=1;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i];
sort(w+1,w+n+1);
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <=i ; j++)
if(i!=j)dp[i][j] =2;
else dp[i][j]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)//枚举后2个
{
int t=w[j]-w[i];//差值(相同的就是0)
for(int k=1;k<j;k++)//注意循环的顺序 ,找前面的
{
if(w[k]-w[j]==w[j]-w[i]||k==j)
{
dp[i][j]=max(dp[i][j],dp[j][k]+1);
}
}
ml=max(ml,dp[i][j]);//记录最大值
}
}
cout<<ml;
}
2个是什么,差值就出来了)
为了方便我们可以排序后进行操作(等差数列一定是单调的)