P4933 大师 题解
CSDN同步 原题链接 简要题意: 求一个数列中有多少个等差子序列。(子序列 不一定连续 ,子串 一定连续 ) 注:公差可以是负数。 算法一 对于 \(30 \%\) 的数据, \(n \leq 20\) . 显然,枚举子序列,然后暴力验证。 时间复杂度: \(O(2^n \times n)\) . 实际得分: \(30pts\) . 算法二 对于 \(60 \%\) 的数据, \(n \leq 100\) , \(v \leq 2 \times 10^3\) . 枚举等差数列前 \(2\) 项,然后算出公差,往后枚举即可。 时间复杂度: \(O(n^3)\) . 实际得分: \(60pts\) ~ \(100pts\) .(取决于程序常数) 算法三 对于另外 \(20 \%\) 的数据,所有电塔的高度构成一个等差数列。 显然,这时答案就相当于在 \(1\) ~ \(n\) 中取等差数列。 为什么呢?这时,只要取等差数列 \(x, x+y , x+y \cdots x+ky\) ,则在 原数列 中对应的数列为: \[a_x , a_{x+y} \cdots a_{x+ky} \] 必然为等差数列,并且每个数列对应一个这样的 等差数列 。 那么,你用上面 \(60 \%\) 的暴力优化一下,枚举任意的两个点都可以形成等差数列,计算即可。 当然有一种特殊情况:即 \(a_i = a_j