链接:
问题描述,示例,和提示:
代码:
class Solution {
public:
int lenLongestFibSubseq(vector<int>& arr) {
const int n = arr.size();
vector<vector<int>> dp(n,vector<int>(n,2));
int ans = 0;
for(int j = 0;j<n;j++)
{
for(int k = j+1;k<n;k++)
{
int need = arr[k]-arr[j];
if(need>=arr[j])
break;
auto it = lower_bound(arr.begin(),arr.begin()+j,need);
int i = it-arr.begin();
if(arr[i]!=need)
continue;
dp[j][k]=dp[i][j]+1;
ans = max(ans,dp[j][k]);
}
}
return ans;
}
};
题目解析:
创建一个n*n的数组dp
当j遍历到j0点的时候,然后k开始遍历到k0点
need=k0-j0,然后在j0之前开始寻找,是否有need,need的坐标是i
有的话就dp[j0][k0]=dp[i][j0]+1;
个人理解:
就按照自己最笨的方法走就行,这个题没有什么好的捷径
考察的点也是,
1.对dp的简单掌握,
2.迭代器的使用,
3. auto it = lower_bound(arr.begin(),arr.begin()+j,need);
int i = it-arr.begin();
在vector中查找数字的情况