# 446 Arithmetic Slices II - Subsequence ###### tags: `leetcode` ## Problem Statement Given an integer array nums, return the number of all the arithmetic subsequences of nums. A sequence of numbers is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same. For example, ```[1, 3, 5, 7, 9]```, ```[7, 7, 7, 7]```, and ```[3, -1, -5, -9]``` are arithmetic sequences. For example, ```[1, 1, 2, 5, 7]``` is not an arithmetic sequence. A subsequence of an array is a sequence that can be formed by removing some elements (possibly none) of the array. For example, ```[2,5,10]``` is a subsequence of ```[1,2,1,2,4,1,5,10]```. The test cases are generated so that the answer fits in 32-bit integer. - Example 1: > Input: nums = [2,4,6,8,10] Output: 7 Explanation: All arithmetic subsequence slices are: $[2,4,6]\\ [4,6,8]\\ [6,8,10]\\ [2,4,6,8]\\ [4,6,8,10]\\ [2,4,6,8,10]\\ [2,6,10]$ - Example 2: > Input: nums = [7,7,7,7,7] Output: 16 Explanation: Any subsequence of this array is arithmetic. - Constraints: > $1 \leq nums.length \leq 1000\\ -2^{31} \leq nums[i] \leq 2^{31} - 1$ ## Solution - Use ```map``` to store the matching number for current number ```i``` with difference ```dif```. ```cpp= vector<unordered_map<int,int>> dp(A.size()); ``` ```cpp= int dif = A[i] - A[j]; dp[i][dif] += 1; ``` - After checking the first 2 elements, check whether it is extensible for the differnece length. ```cpp= if(dp[j].find(dif) != dp[j].end()){ dp[i][dif] += dp[j][dif]; res += dp[j][dif]; } ```