51nod1055(递推)

来源:互联网 发布:win10电脑mac地址修改 编辑:程序博客网 时间:2024/04/30 17:46

链接:点击打开链接

题意:N个不同的正整数,找出由这些数组成的最长的等差数列
例如:1 3 5 6 8 9 10 12 13 14
等差子数列包括(仅包括两项的不列举)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14
其中6 8 10 12 14最长,长度为5

代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;int a[10005];short dp[10005][10005];int main(){    int n,i,j,k,ans;    while(scanf("%d",&n)!=EOF){                 //dp[i][j]为以a[i]和a[j]结尾的最长        ans=1;                                  //等差数列        for(i=0;i<n;i++)        scanf("%d",&a[i]);        sort(a,a+n);        for(i=1;i<n;i++){            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{                    if(dp[j][i]==0)             //第一次相当于初始化                    dp[j][i]=dp[i][k]=3;                    else                        //可以理解为结尾的方向不同                    dp[j][i]=dp[i][k]=dp[j][i]+1;                    ans=max(ans,(int)dp[i][k]);                    j--,k++;                }            }        }        printf("%d\n",ans);    }    return 0;}


 

0 0
原创粉丝点击