Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में सबसे लंबे फाइबोनैचि अनुक्रम की लंबाई

मान लीजिए हमारे पास एक अनुक्रम है X_1, X_2, ..., X_n फाइबोनैकी जैसा है यदि -

  • n>=3

  • X_i + X_{i+1} =X_{i+2} सभी के लिए i + 2 <=n

अब मान लें कि एक अनुक्रम बनाने वाले सकारात्मक पूर्णांकों की एक सख्ती से बढ़ती हुई सरणी ए, हमें ए के सबसे लंबे फाइबोनैकी-जैसे अनुक्रम की लंबाई ढूंढनी है। यदि कोई अस्तित्व में नहीं है, तो 0 लौटाएं। इसलिए यदि संख्या [1,2 की तरह है ,3,4,5,6,7,8], तो आउटपुट 5 होगा। फिबोनाची का सबसे लंबा अनुक्रम [1,2,3,5,8] जैसा है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • रिट:=0

  • एक नक्शा बनाएं m, n :=सरणी A का आकार

  • n x n आकार का dp नामक एक मैट्रिक्स बनाएं

  • मैं के लिए 0 से n - 1 की सीमा में

    • एम [ए [i]]:=मैं

    • j के लिए i-1 की श्रेणी में, 0 से नीचे

      • अनुरोध:=ए[i] – ए[जे]

      • जब A[i] – A[j]

        • dp[i, j] :=अधिकतम dp[i, j], dp[j, m[A[i] – A[j]]] + 1

      • अन्यथा dp[i,j] :=अधिकतम dp[i, j] और 2

      • ret :=अधिकतम रिट और dp[i,j]

  • रिटर्न रिट जब रिट> =3 अन्यथा रिटर्न 0.

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int lenLongestFibSubseq(vector<int> & A) {
      int ret = 0;
      unordered_map <int, int> m;
      int n = A.size();
      vector < vector <int> > dp(n, vector <int>(n));
      for(int i = 0; i < n; i++){
         m[A[i]] = i;
         for(int j = i - 1; j >= 0; j--){
            int req = A[i] - A[j];
            if(A[i] - A[j] < A[j] && m.count(A[i] - A[j])){
               dp[i][j] = max(dp[i][j], dp[j][m[A[i] - A[j]]] + 1);
            }else{
               dp[i][j] = max(dp[i][j], 2);
            }
            ret = max(ret, dp[i][j]);
         }
      }
      return ret >= 3 ? ret : 0;
   }
};
main(){
   vector<int> v = {1,2,3,4,5,6,7,8};
   Solution ob;
   cout << (ob.lenLongestFibSubseq(v));
}

इनपुट

[1,2,3,4,5,6,7,8]

आउटपुट

5

  1. C++ में 0 और 1 के सेगमेंट की अधिकतम लंबाई

    समस्या कथन इकाई और शून्य से मिलकर बनी एक स्ट्रिंग को देखते हुए। कार्य स्ट्रिंग के खंडों की अधिकतम लंबाई का पता लगाना है जैसे कि प्रत्येक खंड में 1 की संख्या 0 से अधिक हो उदाहरण यदि इनपुट स्ट्रिंग 10111000001011 है, तो उत्तर 12 इस प्रकार होगा - पहला खंड 7 10111000001011 लंबाई का है दूसरा खंड 5 101

  1. सबसे लंबे समय तक सामान्य बाद के लिए सी ++ कार्यक्रम

    एक अनुक्रम तत्वों के सेट के समान क्रम वाला अनुक्रम है। अनुक्रम स्टुव के लिए, अनुवर्ती स्टु, तुव, एसयूवी, .... आदि हैं। लंबाई n की एक स्ट्रिंग के लिए, स्ट्रिंग से अनुवर्ती बनाने के 2n तरीके हो सकते हैं। उदाहरण एबीसीडीजीएच और एईडीएफएचआर स्ट्रिंग्स के लिए सबसे लंबा सामान्य अनुक्रम लंबाई 3 का है। #inc

  1. पायथन में सबसे लंबे फाइबोनैचि अनुक्रम की लंबाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास एक अनुक्रम है जैसे X_1, X_2, ..., X_n फाइबोनैकी जैसा है अगर - =3 X_i + X_i+1 =X_i+2 सभी के लिए i + 2 <=n अब मान लीजिए कि एक सख्ती से बढ़ती हुई एरे ए एक अनुक्रम बना रही है, हमें ए के सबसे लंबे फाइबोनैचि-समान अनुक्रम की लंबाई का पता लगाना है। यदि ऐसा कोई अनुक्रम नहीं है,