51nod 1055 最长等差数列

来源:互联网 发布:导航升级软件下载 编辑:程序博客网 时间:2024/05/23 17:22
n^2的算法可以做,先给数组a进行排序,遍历a【i】,让j=i-1,k=i+1.if(a[j]+a[k]>a[i])j--
if(a[j]+a[k]<a[i])k++,等于的话就是一个等差数列。所以要有dp【i】【k】记录以前的状态。
dp[i][j]代表以a[i],a[j]结尾的等差数列有多少个
4
1 2 3 4
这组测试数据看着代码想想就可以了。
#include <iostream>#include<bits/stdc++.h>#define ll long longusing namespace std;int a[10010];short int dp[10009][10009],ans=2;int main(){    int n;    scanf("%d",&n);    memset(dp,0,sizeof(dp));    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    sort(a+1,a+n+1);    for(int i=2;i<=n;i++)    {        int j=i-1,k=i+1;        while(j>0&&k<=n)        {            if(a[j]+a[k]>2*a[i])j--;       else if(a[j]+a[k]<2*a[i])k++;        else       {           dp[i][k]=(dp[j][i]==0?3:dp[j][i]+1);           ans=max(ans,dp[i][k]);           j--;           k++;       }        }    }    printf("%d\n",ans);   return 0;}


原创粉丝点击