2020牛客国庆集训派对day4 B.Arithmetic Progressions(DP)

地址:https://ac.nowcoder.com/acm/contest/7831/B

题意:

从数组中选出最长等差数列。

解析:

定义dp[i][j],表示此等差数列的最后两项。那么ai,aj的等差数列长度的确定,来自于之前的a[c](往左第一个差值符合的数),c~i+j

所以转移方程就为 : 

c存在的情况下:

dp[i][j]=max(dp[bef][i]+1,dp[i][j]);

#include <bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 5e3+10;
int dp[maxn][maxn];
int n;
int a[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+1+n);
    int maxx=0;
    for(int i=1;i<=n;i++)
    {
        int bef=i-1;
        for(int j=i+1;j<=n;j++)
        {
            int md=a[j]-a[i];
            while(bef>=1&&(a[i]-a[bef])<md)
                bef--;
    //        cout<<bef<<"!"<<endl;
            if(bef<1||a[i]-a[bef]>md)
            {
                dp[i][j]=2;
            }
            else
            {
                dp[i][j]=max(dp[bef][i]+1,dp[i][j]);
            }
            maxx=max(maxx,dp[i][j]);
        }
    }
    cout<<maxx<<endl;
}
原文地址:https://www.cnblogs.com/liyexin/p/13775647.html