您的位置:首页 > 其它

51nod 1055 最长等差数列

2016-12-01 22:39 274 查看
dp转移很神奇,枚举中间点。有点像floyd。

#include<bits/stdc++.h>
using namespace std;

const int MAXN=10010;
short int dp[MAXN][MAXN];
int a[MAXN];

int main()
{
int n,i,j,k,ans;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
dp[i][j]=2;
for(j=1;j<=n;j++)
{
i=j-1;k=j+1;
for(;i>=1&&k<=n;)
{
if(a[i]+a[k]==(a[j]<<1))
{
dp[j][k]=dp[i][j]+1;
i--;
k++;
}
else if(a[i]+a[k]<(a[j]<<1))
k++;
else
i--;
}
}
ans=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
ans=max(ans,(int)dp[i][j]);
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod dp