开发者社区> 问答> 正文

遇到一个数列问题,求解答。

众所周知,小明是一个数学小能手,有一天数学老师给了小明一个长度为n (2<=n<=5000)的序列,其中第i个数是ai(0<=ai<=1e9),数学老师想知道这个序列排序后,其中最长的等差子序列的长度是多长,聪明的你能帮小明解决这个问题吗?其中等差子序列的定义为:一个长度为 length 的等差序列 b1、b2……blength,并且序列 b 是序列 a 排序后的子序列。请注意子序列的定义:在原来序列中找出任意数量,任意位置的元素,在不调换这些选出的元素前后顺序的情况下,组成的新序列,称为原序列的子序列。第一行为序列的长度 n(2<=n<=5000),接下来一行是n个数,其中第i个数是ai(0<=ai<=1e9)。输出一行,最长的等差子序列 b 的长度 length。

展开
收起
游客4skzfvnrxrzbi 2021-12-23 16:50:44 482 0
1 条回答
写回答
取消 提交回答
  • 首先来理解一下题目:数学老师让小明求的是 n 个数中最长的等差数列长度,可以用 dpi 表示以 a[j] 和 a[i] 为结尾的等差序列的最长长度。因为我们肯定要保存一个公差作为状态量,但是直接枚举 0-1e9 又不现实。所以我们巧妙的设计出了这个状态,使得我们的公差就被 a[i]-a[j] 表示了。因此我们的转移就应该是在三个数中转移。即a[i],a[j],a[k],i 根据等差数列的性质,若 a[i],a[j],a[k] 构成等差序列,那么 a[i]+a[k]=2*a[j]; 每次转移更新答案即可。因此: 输入:6 [0,1,3,5,6,9] 输出:4

    2021-12-23 18:40:24
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载