动态规划
- 思路:
- 定义 dp[v] 是值为 v 结尾的最长等差子序列个数;
- 状态转移方程为:
- v 上一个序列值为 v - d,即 dp[v] = dp[v - d] + 1;
- 通过遍历序列,动态规划找到所有序列元素的最长等差数列的个数,结果为其中最大的值;
- 因为下标不是连续的,可以使用哈希表来存储 dp;
cpp
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
int ans = 0;
std::unordered_map<int, int> dp;
for (int v : arr) {
dp[v] = dp[v - difference] + 1;
ans = std::max(ans, dp[v]);
}
return ans;
}
};