Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Length of Longest Fibonacci Subsequence ใน C++

คำอธิบายปัญหา

ลำดับ 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)

  1. dp[i][j] = ความยาว Fibonacci-like subsequence สูงสุดที่ลงท้ายด้วย A[i], A[j] (i
  2. ต้องการหา k < i ที่ A[k] + A[i] = A[j] → A[k] = A[j] - A[i]
  3. ใช้ map เก็บ index ของแต่ละค่า
  4. 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