446. 等差数列划分 II - 子序列
思路:类似最长上升子序列,注意开long long
就好。
体会:dp
开一维不够表示的时候多开一维
using ll = long long;
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n = nums.size(), res = 0;
vector<unordered_map<ll, ll>>f(n + 1),g(n + 1);
for(int i = 1; i < n; ++i)
for(int j = 0; j < i; ++j){
ll delta = (ll)nums[i] - nums[j];
if(f[j].count(delta))f[i][delta] += f[j][delta];
if(g[j].count(delta))f[i][delta] += g[j][delta];
g[i][delta] += 1;
}
for(int i = 0; i < n; ++i)
for(auto& [k,v] : f[i])
res += v;
return res;
}
};