zoukankan      html  css  js  c++  java
  • cf255C Almost Arithmetical Progression

    C. Almost Arithmetical Progression
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented as:

    • a1 = p, where p is some integer;
    • ai = ai - 1 + ( - 1)i + 1·q (i > 1), where q is some integer.

    Right now Gena has a piece of paper with sequence b, consisting of n integers. Help Gena, find there the longest subsequence of integers that is an almost arithmetical progression.

    Sequence s1,  s2,  ...,  sk is a subsequence of sequence b1,  b2,  ...,  bn, if there is such increasing sequence of indexes i1, i2, ..., ik (1  ≤  i1  <  i2  < ...   <  ik  ≤  n), that bij  =  sj. In other words, sequence s can be obtained from b by crossing out some elements.

    Input

    The first line contains integer n (1 ≤ n ≤ 4000). The next line contains n integers b1, b2, ..., bn (1 ≤ bi ≤ 106).

    Output

    Print a single integer — the length of the required longest subsequence.

    Examples
    input
    2
    3 5
    output
    2
    input
    4
    10 20 10 30
    output
    3
    Note

    In the first test the sequence actually is the suitable subsequence.

    In the second test the following subsequence fits: 10, 20, 10.

    dp[i][j]表示以a[i]为尾,a[j]是这个序列前一个数的最长长度

    dp[i][j]=max(dp[j][k]+1){0<=k<j&&a[k]==a[i]}但这样复杂度是O^3

    但是dp[j][k]中的k肯定是选择最靠近j的那个,假如有k1<k2<……<kx<j,dp[j][kx]>=dp[j][k(1~x-1)]

    这样的话,复杂度就变成O^2了

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    typedef long long ll;
    #define X first
    #define Y second
    #define mp(a,b) make_pair(a,b)
    #define pb push_back
    #define sd(x) scanf("%d",&(x))
    #define Pi acos(-1.0)
    #define sf(x) scanf("%lf",&(x))
    #define ss(x) scanf("%s",(x))
    #define maxn 10000000
    #include <ctime>
    const int inf=0x3f3f3f3f;
    const long long mod=1000000007;
    using namespace std;
    int dp[5005][5005];
    int num[5005];
    int main()
    {
        #ifdef local
        freopen("in","r",stdin);
        //freopen("data.txt","w",stdout);
        int _time=clock();
        #endif
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            sd(num[i]);
        int ans=0;
        int la;
        for(int i=1;i<=n;i++)
        {
            la=0;
            for(int j=0;j<i;j++)
            {
                dp[i][j]=dp[j][la]+1;
                if(num[i]==num[j])la=j;
                ans=max(dp[i][j],ans);
            }
        }
        cout<<ans<<endl;
        #ifdef local
        printf("time: %d
    ",int(clock()-_time));
        #endif
    }
    View Code

     

  • 相关阅读:
    uva 408 Uniform Generator
    Java实现 蓝桥杯VIP 算法提高 栅格打印问题
    Java实现 蓝桥杯VIP 算法提高 栅格打印问题
    Java实现 蓝桥杯VIP 算法提高 栅格打印问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 不同单词个数统计
    Java实现 蓝桥杯VIP 算法提高 不同单词个数统计
  • 原文地址:https://www.cnblogs.com/scau-zk/p/5654397.html
Copyright © 2011-2022 走看看