跳转至

3409. 最长相邻绝对差递减子序列

题目描述

给你一个整数数组 nums 。

你的任务是找到 nums 中的 最长 子序列 seq ,这个子序列中相邻元素的 绝对差 构成一个 非递增 整数序列。换句话说,nums 中的序列 seq0, seq1, seq2, ..., seqm 满足 |seq1 - seq0| >= |seq2 - seq1| >= ... >= |seqm - seqm - 1| 。

请你返回这个子序列的长度。

 

示例 1:

输入:nums = [16,6,3]

输出:3

解释:

最长子序列是 [16, 6, 3] ,相邻绝对差值为 [10, 3] 。

示例 2:

输入:nums = [6,5,3,4,2,1]

输出:4

解释:

最长子序列是 [6, 4, 2, 1] ,相邻绝对差值为 [2, 2, 1] 。

示例 3:

输入:nums = [10,20,10,19,10,20]

输出:5

解释:

最长子序列是 [10, 20, 10, 19, 10] ,相邻绝对差值为 [10, 10, 9, 9] 。

 

提示:

  • 2 <= nums.length <= 104
  • 1 <= nums[i] <= 300

解法

方法一

思考

子序列要求相邻差的绝对值严格递减。\(n\le 10^4\),若按子序列子集枚举不可行;值域却只有 \([1,300]\),相邻差至多 \(299\)

决策只依赖于「当前结尾的值」与「上一段相邻差」,据此转移可以在值域上完成。

\(f[v][d]\) 为以值 \(v\) 结尾、最后一段差为 \(d\) 的最长长度。加入 \(x\) 时枚举上一个值 \(y\) 与差 \(d>|x-y|\),用 \(f[y][d]\) 更新 \(f[x][|x-y|]\)。值域有限,总时间可接受。

1

1

1

1

评论