51Nod 1055 思维 + DP

题目链接


题意:求 n n n个数中最长的等差数列(差任意)

思路:
利用等差数列的性质:
a [ i ] 、 a [ j ] 、 a [ k ] a[i]、a[j]、a[k] a[i]a[j]a[k]为等差数列,则一定有:
a [ j ] ∗ 2 = a [ i ] + a [ k ] a[j]*2 = a[i] + a[k] a[j]2=a[i]+a[k]

故我们考虑枚举这么一个三元组进行DP。
d p [ i ] [ j ] dp[i][j] dp[i][j] 1 − j 1-j 1j中满足以 a [ j ] a[j] a[j]结尾,公差为 d = a [ j ] − a [ i ] d = a[j]-a[i] d=a[j]a[i]的最长等差数列的长度

考虑枚举三元组的中间数的位置 i i i
l = i − 1 l = i-1 l=i1、$ r = i+1$

a [ l ] + a [ r ] > 2 ∗ a [ i ] a[l] + a[r] > 2*a[i] a[l]+a[r]>2a[i] l − − l-- l
a [ l ] + a [ r ] &lt; 2 ∗ a [ i ] a[l] + a[r] &lt; 2*a[i] a[l]+a[r]<2a[i] r + + r++ r++
a [ l ] + a [ r ] = = 2 ∗ a [ i ] a[l] +a[r] == 2*a[i] a[l]+a[r]==2a[i]时,更新 d p [ i ] [ r ] = d p [ l ] [ i ] + 1 dp[i][r] = dp[l][i] + 1 dp[i][r]=dp[l][i]+1

初始时每一个 d p dp dp数组里的元素值均为 2 2 2

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int A = 1e4 + 10;
short int dp[A][A];
int a[A];

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0 ;i<n ;i++) scanf("%d",&a[i]);

    sort(a,a+n);
    int ans = 0;
    for(int i=0 ;i<n ;i++){
        int l = i-1,r = i+1;
        while(l>=0 && r<n){
            if(a[l]+a[r] > 2*a[i]) l--;
            else if(a[l] + a[r] < 2*a[i]) r++;
            else{
                dp[i][r] = dp[l][i] + 1;
                if(dp[i][r] > ans) ans = dp[i][r];
                l--;r++;
            }
        }
    }
    printf("%d\n",ans+2);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值