LeetCode 873. 最长的斐波那契子序列的长度
DP
const int N = 1010;
class Solution {
public:
int f[N][N]; //以下标i结尾的是从下标j转移过来的
int lenLongestFibSubseq(vector<int>& arr) {
int n = arr.size();
unordered_map<int, int> hash; //数值和下标的映射
for(int i = 0; i < n; i ++)
hash[arr[i]] = i;
int res = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < i; j ++)
{
f[i][j] = max(2, f[i][j]); //如果存在最小长度为2
// arr[i] - arr[j] 就是前一个数
if(hash.count(arr[i] - arr[j]))
{
int k = hash[arr[i] - arr[j]];
if(k < j)
f[i][j] = f[j][k] + 1;
}
res = max(res, f[i][j]);
}
return res == 2 ? 0 : res; //长度为2不是
}
};