คำอธิบายปัญหา
ลำดับ X เป็น Fibonacci-like ถ้า n>=3 และ X[i] + X[i+1] = X[i+2] สำหรับทุก i กำหนดอาร์เรย์ A เพิ่มขึ้นอย่างเคร่งครัด ต้องการความยาว longest Fibonacci-like subsequence (ไม่ต้องติดกัน)
ตัวอย่าง: [1,2,3,4,5,6,7,8] → 5 ([1,2,3,5,8])
วิธีแก้ปัญหา (DP + Hash Map)
- dp[i][j] = ความยาว Fibonacci-like subsequence สูงสุดที่ลงท้ายด้วย A[i], A[j] (i
- ต้องการหา k < i ที่ A[k] + A[i] = A[j] → A[k] = A[j] - A[i]
- ใช้ map เก็บ index ของแต่ละค่า
- dp[i][j] = dp[k][i] + 1 (ถ้ามี k) มิฉะนั้น 2
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int lenLongestFibSubseq(vector<int>& A) {
int n = A.size();
unordered_map<int, int> index;
for(int i = 0; i < n; i++) index[A[i]] = i;
vector<vector<int>> dp(n, vector<int>(n, 2));
int ret = 0;
for(int j = 0; j < n; j++) {
for(int i = 0; i < j; i++) {
int need = A[j] - A[i];
if(need < A[i] && index.count(need)) {
int k = index[need];
dp[i][j] = dp[k][i] + 1;
ret = max(ret, dp[i][j]);
}
}
}
return ret >= 3 ? ret : 0;
}
};
int main() {
vector<int> v = {1,2,3,4,5,6,7,8};
Solution ob;
cout << ob.lenLongestFibSubseq(v);
return 0;
}
อินพุต
[1,2,3,4,5,6,7,8]
เอาต์พุต
5