zoukankan      html  css  js  c++  java
  • 51nod1055 最长等差数列

    $n leq 10000$的不同数字,问能组成的最长等差数列。

    $f(i,j)$--$i,j$结尾的最长等差数列。枚举中间$i$,往左右扩展,找$j,k$,用$f(j,i)$来更新$f(i,k)$。

    $n leq 100000$的暂时不会。

     1 //#include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 //#include<time.h>
     5 //#include<complex>
     6 //#include<set>
     7 //#include<queue>
     8 //#include<vector>
     9 #include<algorithm>
    10 #include<stdlib.h>
    11 using namespace std;
    12 
    13 #define LL long long
    14 int qread()
    15 {
    16     char c; int s=0,f=1; while ((c=getchar())<'0' || c>'9') (c=='-') && (f=-1);
    17     do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s*f;
    18 }
    19 
    20 //Pay attention to '-' , LL and double of qread!!!!
    21 
    22 int n;
    23 short f[10002][10002];
    24 int a[10011];
    25 int main()
    26 {
    27     n=qread();
    28     for (int i=1;i<=n;i++) a[i]=qread();
    29     sort(a+1,a+1+n);
    30     for (int i=1;i<=n;i++)    
    31         for (int j=i+1;j<=n;j++)
    32             f[i][j]=2;
    33     for (int i=1;i<=n;i++)
    34     {
    35         int j=i-1,k=i+1,v=a[i]*2;
    36         while (j && k<=n)
    37         {
    38             int u=a[j]+a[k];
    39             if (u<v) k++;
    40             else if (u>v) j--;
    41             else if (u==v) {f[i][k]=max(f[i][k],short(f[j][i]+1)); j--; k++;}
    42         }
    43     }
    44     int ans=0;
    45     for (int i=1;i<=n;i++)
    46         for (int j=i+1;j<=n;j++)
    47             ans=max(ans,(int)f[i][j]);
    48     printf("%d
    ",ans);
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    【2】网站搭建:数据库选型
    【1】网站搭建:模型设计
    输入法评价
    站立会议个人博客六
    站立会议个人博客五
    站立会议个人博客四
    站立会议个人博客三
    第十一周学习进度表
    站立会议个人博客二
    典型用户和用户场景描述。
  • 原文地址:https://www.cnblogs.com/Blue233333/p/9169339.html
Copyright © 2011-2022 走看看